我試圖將這些字串作為除零以外的項目的輸出:
[21-40]
[41-60]
[61-80]
[81-100]
但以下腳本以某種方式嘗試評估_FILENAME
變數的內容。
#!/bin/bash
for i in 0 21 41 61 81
do
if (( $i > 0 ))
then
_FILENAME="[$i-$((i+19))]"
else
_FILENAME="First File"
fi
echo $_FILENAME
done
我確信我在這裡遺漏了一些語法。
答案1
在變數引用周圍使用雙引號,例如$_FILENAME
.如果沒有雙引號,shell 將嘗試將變數的內容拆分為多個“單字”,並展開它找到的任何檔案 glob(通配符表達式)。表達如[21-40]
是globs(這個符合任何名為「2」、「1」到「4」或「0」的檔案)。如果目前目錄中碰巧有任何符合名稱的文件,則會列印文件清單而不是括號表達式。因此,您需要做的就是使用:
echo "$_FILENAME"
而不是未引用的版本。順便說一句,最好使用小寫(或混合大小寫)作為 shell 變數名稱,以避免與許多對 shell 或其他程式具有特殊意義的神奇變數發生衝突。
答案2
戈登正確描述了您的程式碼的問題在他的回答中。我正在為您提供程式碼的替代版本,就像我編寫它的方式一樣:
echo 'First file'
for (( i = 20; i < 100; i += 20 )); do
printf '[%d-%d]\n' "$(( i + 1 ))" "$(( i + 20 ))"
done
printf
對於輸出使用者提供的資料或可變資料來說,使用通常更安全。參見例如為什麼 printf 比 echo 更好?
由於間隔是規則的,因此 C 樣式for
循環可能比明確列出每個間隔起始編號更適合。