0

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

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

echo $fileNum返回这个数字没有任何问题。现在我需要fileNum在 for 循环中使用,但我遇到了问题。

我的 for 循环是:

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在其周围加上单引号。它与字符串有关吗?

4

3 回答 3

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
于 2012-08-20T16:56:06.207 回答
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
于 2012-08-20T16:10:27.147 回答
0

我宁愿写:

for i in $(seq $fileNum)
do
  ....
done
于 2012-08-20T16:11:00.330 回答