1

在 shell 脚本中,我将不得不访问存储在 /usr/local/mysql/data 中的二进制日志。但是当我这样做时,

STARTLOG=000002
ENDLOG=000222
file=`ls -d /usr/local/mysql/data/mysql-bin.{$STARTLOG..$ENDLOG}| sed 's/^.*\///'`
echo $file

我收到以下错误:

ls: cannot access /usr/local/mysql/data/mysql-bin.{000002..000222}: No such file or directory. 

但是,当我手动输入范围内的数字时,shell 脚本会正常运行而不会出错。

4

3 回答 3

3

在 bash 中,大括号扩展发生在变量扩展之前。这意味着您不能在内部使用变量{}并获得预期的结果。我建议使用数组和 for 循环:

startlog=2
endlog=222
files=()

for (( i=startlog; i<=endlog; i++ ));
   fname=/usr/local/mysql/data/mysql-bin.$(printf '%06d' $i)
   [[ -e "$fname" ]] && files+=("${fname##*/}")
done

printf '%s\n' "${files[@]}"
于 2013-02-18T06:39:02.860 回答
2

尝试使用seq(1)

file=`ls -d $(seq --format="/usr/local/mysql/data/mysql-bin.%06.0f" $STARTLOG $ENDLOG) | sed 's/^.*\///'`
于 2013-02-18T06:36:44.033 回答
0

您想要 000002..000222 范围内的文件

但是由于引号,您要求使用该名称的文件

/usr/local/mysql/data/mysql-bin.{000002..000222}

我会使用一个shell循环:http ://www.cyberciti.biz/faq/bash-loop-over-file/

于 2013-02-18T06:16:38.597 回答