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

Gordonがコードの問題を正しく説明しました。彼の答えに。私が書いたのと同じ代替バージョンのコードを提供します。

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スタイルのループがより適している可能性があります。

関連情報