将前导零添加到整数而不在bash中进行强制转换

时间:2017-10-06 23:51:57

标签: bash shell

我有以下代码,它应该将当前工作目录中的所有文件重命名为" basenameCOUNTextension",作为命令行参数给出。

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错误。

2 个答案:

答案 0 :(得分:4)

=左侧未使用美元符号在bash中分配变量。

美元符号表示在评估命令之前用该变量的值替换变量。因此,如果$mid还没有值,则$mid="c"变为=c,它没有有效的内置含义,因此bash会查找名为=c的可执行文件$PATH,以及无法找到的错误。

另一方面,c应该是变量,而不是普通字符串“c”,所以你似乎意味着$c

所以你应该有更像mid=$c的东西。

您也可以考虑通过使用shell内置printf命令来避免第一个if链来简化此操作:

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

答案 1 :(得分:2)

您不使用$ 在shell脚本中分配变量。此外,for file in遍布您提供的字符串,而不是目录,因此请使用for file in *