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。二重引用符がない場合、シェルは変数の内容を複数の「単語」に分割しようとし、見つかったファイルグロブ(ワイルドカード表現)も展開します。[21-40] globs (これは「2」、「1」から「4」、または「0」という名前のファイルに一致します)。現在のディレクトリに一致する名前のファイルがある場合は、括弧式の代わりにファイルのリストが印刷されます。したがって、必要なのは以下を使用することだけです。

echo "$_FILENAME"

引用符なしのバージョンの代わりに、 を使用します。ちなみに、シェルや他のプログラムにとって特別な意味を持つ多くのマジック変数との競合を避けるために、シェル変数名には小文字 (または大文字と小文字の混在) を使用するのが最適です。

答え2

ゴードンはあなたのコードの問題点を適切に説明しました彼の答えの中で. コードの代替バージョンを、私が書いたものと同じ方法で示します。

echo 'First file'

for (( i = 20; i < 100; i += 20 )); do
    printf '[%d-%d]\n' "$(( i + 1 ))" "$(( i + 20 ))"
done

一般的に、ユーザー指定のデータや変数データを出力する場合は を使用する方printfが安全です。例:なぜ printf は echo よりも優れているのでしょうか?

間隔は規則的であるため、for各間隔の開始番号を明示的にリストするよりも、C スタイルのループの方が適している可能性があります。

関連情報