在bash脚本中使用变量进行循环

时间:2012-08-20 16:03:23

标签: bash for-loop awk

我的文件夹中包含.pdfs的文件。我将此数字分配给变量fileNum,如下所示:

  

fileNum=$(ls -l *.pdf | wc -l)

echo $fileNum会毫无问题地返回此数字。 现在我需要在for循环中使用fileNum,我遇到了问题。

我的循环是:

for i in {1..$fileNum}
do
 var=$(awk 'NR=='$i 'pdfs.file')

 gs \
 -sOutputFile="exgs_"$var \
 -sDEVICE=pdfwrite \
 -sColorConversionStrategy=Gray \
 -dProcessColorModel=/DeviceGray \
 -dCompatibilityLevel=1.4 \
 -dNOPAUSE \
 -dBATCH \
$var

done

$开头的fileNum给出了一条错误消息:

  

awk:第1行:{

处或附近的语法错误

当我实际使用数字本身(在这种情况下是17)时,事情很好。 显然,awk不喜欢这个,因为... ......我不知道是什么。我该怎么办呢?

我尝试了其他表单,例如$(fileNum)filenum,并附带单引号。 它与字符串有关吗?

3 个答案:

答案 0 :(得分:4)

我使用bash来读取文件而不是为每一行运行awk。

while read -r file; do
    gs -sOutputFile="exgs_$file" \
       -sDEVICE=pdfwrite \
       -sColorConversionStrategy=Gray \
       -dProcessColorModel=/DeviceGray \
       -dCompatibilityLevel=1.4 \
       -dNOPAUSE \
       -dBATCH \
       "$file"
done < pdfs.file

另见http://mywiki.wooledge.org/BashFAQ/001

否则,对于你想从1迭代到 n 的一般情况,我会使用C风格的for循环。

n=10
for (( i=1; i <= n; i++)); do
   ...
done

答案 1 :(得分:2)

这是因为Bash会在变量之前对大括号进行扩展。在这种情况下,您需要使用eval,以便Bash首先扩展变量。

for i in $(eval echo {1..$fileNum})
do
 var=$(awk 'NR=='$i 'pdfs.file')

 gs \
 -sOutputFile="exgs_"$var \
 -sDEVICE=pdfwrite \
 -sColorConversionStrategy=Gray \
 -dProcessColorModel=/DeviceGray \
 -dCompatibilityLevel=1.4 \
 -dNOPAUSE \
 -dBATCH \
$var

done

答案 2 :(得分:0)

我宁愿写:

for i in $(seq $fileNum)
do
  ....
done