0

フォルダに.pdfの数を含むファイルがあります。fileNumこの番号を次のように変数に割り当てます。

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

echo $fileNumこの番号を問題なく返します。fileNumforループで使用する必要があり、問題が発生しています。

私の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

すべての行に対してawkを実行する代わりに、bashを使用してファイルを読み取ります。

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が変数の前にある中括弧を拡張するためです。この場合、Bashが最初に変数を展開するように、evalを使用する必要があります。

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 に答える