2017-10-06 13 views
0

コマンドライン引数として与えられた、現在の作業ディレクトリ内のすべてのファイルの名前を "basenameCOUNTextension"に変更するコードがあります。bashでキャストのない整数に先行ゼロを追加する

base=$1 
ext=$2 
c=1 
for file in * 
do 
    if [ c > 100 ]; then 
    mid=$(printf "%03d" $c) 
    elif [ c > 10 ]; then 
    mid=$(printf "%03d" $c) 
    else 
    mid=$(printf "%03d" $c) 
    fi 
    if [ -e ./"$file$mid$ext" ] 
    then 
    continue 
    fi 
    mv "$file" "$base$mid$ext" 
    ((c++)) 
done 

これは、このスクリプトを正常に実行した後にディレクトリ内のコンテンツの例のようになります。

$ renumber 25thAnniversary jpeg 
then the resulting files should have names like: 
25thAnniversary001.jpeg, 25thAnniversary002.jpeg, 25thAnniversary003.jpeg, etc. 

は「001」、「939」の取り扱いなど、私の問題です。私はprintfが行くかどうか、あるいはいくつかの条件文だけがわからない。

これは私のコンパイルエラーです:

renumber.sh: line 12: =c: command not found 
mv: cannot move â(FILEPATH)â to ââ: No such file or directory 

私の問題は何ですか? 12行目は私には構文エラーのようには見えませんが、私はmvエラーを理解していません。

+0

をhttp://tldp.org/LDP/abs/html/)。 –

答えて

4

ドル記号は、=の左側にbashで変数を割り当てるために使用されていません。

ドル記号は、コマンドを評価する前に変数をその変数の値に置き換えることを意味します。したがって、$midにまだ値がない場合、$mid="c"=cになります。これは有効な組み込みの意味を持たないため、の実行可能ファイル=cを検索し、見つからない場合はエラーが発生します。

一方、cは変数であり、プレーンストリング "c"ではなく、$cのように見えます。

だから、mid=$cのようなものが必要です。

また、最初ifチェーン避けるためにprintf組み込みコマンドシェルを使用してこれを簡素化する検討するかもしれない:([** **高度なバッシュ・スクリプトガイド]私は1,2時間をお勧めします

mid=$(printf "%03d" $c) 
+0

私の主な問題は、 "[]"型の算術演算子を条件付きで使用しているようでした。私は(()を使っていたはずです) –

2

あなたは使用しません$からにはシェルスクリプトの変数を割り当てます。また、for file inは、ディレクトリではなく、与えた文字列のまわりでループするので、for file in *を使用してください。

関連する問題