ダッシュの範囲はどのように機能しますか?

ダッシュの範囲はどのように機能しますか?

ダッシュで次のbashスクリプトをすばやく実行する方法を見つけようとしています。

for x in {1..5}
do
    for y in {a..c}
    do
    echo $HOME$x$y
    done
done

Dash は中かっこ拡張をサポートしておらず、上記のスクリプトを模倣するスコープに似た構成を取得する他の方法を知りません。 whileループで解決できると思いますが、スクリプト適応ではなく全く違う獣だと思います。

Dashで上記のスクリプトの精神を維持することは可能ですか? seqのような外部プログラムを使用せずに上記のスクリプトの精神を維持できますか?どのように?

答え1

角かっこ拡張自体はPOSIXでは定義されておらず、他のPOSIX互換ツールのオプションを使用して変換する必要があります。そのようなアプローチの1つは、ASCIIテーブルを使用して文字のASCII値を対応する文字値に変換することですprintf()。価値マッピングを見つけてくださいman ascii

i=1
asciiStart=97
asciiEnd=99
while [ "$i" -le 5 ]
do
    while [ "$asciiStart" -le "$asciiEnd" ]
    do
        echo "$HOME$i$(printf "\\$(printf '%03o' "$asciiStart")")"
        asciiStart=$((asciiStart + 1))
    done
    asciiStart=97
    i=$(( i + 1 )) 
done

答え2

おそらくそうではありません。なぜなら、中かっこ拡張が実行するアクションを実行する他の関数がある場合は、中括弧拡張は必要ないからです。

リストが静的でない場合(たとえば、上限が異なる)、Bashでは中括弧拡張を簡単に使用できません。{1..$n}必要に応じて行われないからです(中括弧拡張)。今後変わりやすい)。

一方、あなたのリストははい静的であれば、他のプログラムを使用してリストを生成し、それをスクリプトに直接挿入することは難しくないので、結果は次のようになります。

for x in 1 2 3 4 5; do
    for y in a b c; do
        echo "$HOME$x$y"
    done
done

シェルから文字リストを生成するためにaを使用するのもwhile少し難しいようです。

申し訳ありません。しかし、他の言語ではこれを行う方が簡単です。パールのように:

highnum=5 highchar=c perl -le 'for $x (1..$ENV{highnum}) { 
                                  for $y ("a"..$ENV{highchar}) { 
                                     print "$ENV{HOME}/$x$y"; } }'

関連情報