2017-10-06 34 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

我推薦一兩個小時用[**高級Bash腳本編程指南**]( http://tldp.org/LDP/abs/html/)。 –

回答

4

=的左側不使用美元符號來分配bash中的變量。

美元符號表示在評估命令之前用該變量的值替換變量。因此,如果$mid還沒有值,$mid="c"將變爲=c,它沒有有效的內置含義,因此bash在$PATH上查找名爲=c的可執行文件,並在找不到該可執行文件時發生錯誤。

另一方面,c應該是一個變量,而不是純字符串「C」,所以你似乎意味着$c

所以你應該有更像mid=$c的東西。

你也可以考慮用外殼簡化這個內置printf命令,以避免第一if鏈:

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

我的主要問題似乎是我在「[]」類型條件中使用算術運算符。我應該一直使用(()) –

2

您不使用$將外殼腳本中的變量賦值爲。另外,for file in只是在您給它的字符串上進行循環,而不是在目錄上循環,因此請使用for file in *

相關問題