如何在 bash 腳本中計算涉及數學的連接字串

如何在 bash 腳本中計算涉及數學的連接字串

我試圖將這些字串作為除零以外的項目的輸出:

[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循環可能比明確列出每個間隔起始編號更適合。

相關內容