我的文件夹中包含.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
,并附带单引号。
它与字符串有关吗?
答案 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