簡體   English   中英

在bash腳本中使用變量進行循環

[英]Using a variable in a bash script for loop

我的文件夾中有一個包含.pdf數量的文件。 我將這個數字分配給變量fileNum如下所示:

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

echo $fileNum返回此數字。 現在,我需要在for循環中使用fileNum ,但遇到了問題。

我的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 ,並用單引號引起來。 與弦有關嗎?

我會使用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

這是因為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

我寧願寫:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM