1

シェルスクリプトでは、/ 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. 

しかし、範囲内の数値を手動で入力すると、シェルスクリプトはエラーなしで正常に実行されます。

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}

シェル ループを使用します: http://www.cyberciti.biz/faq/bash-loop-over-file/

于 2013-02-18T06:16:38.597 に答える