変数を使った括弧展開? [重複] 質問する

変数を使った括弧展開? [重複] 質問する
#!/bin/sh
for i in {1..5}
do
   echo "Welcome"
done

動作します。Welcome を 5 回表示します。

#!/bin/sh
howmany=`grep -c $1 /root/file`
for i in {1..$howmany}
do
   echo "Welcome"
done

動作しません。 はhowmany5 に等しくなります。これは、出力にgrep -c表示される値です。 $1 は、スクリプトを実行するときに指定されるパラメーター 1 です。

何か案は?

ベストアンサー1

回避策シーケンス中括弧式で変数を使用できない理由:

  • もしその意図が単に範囲内の数値を反復処理する- OPの場合のように -最良の選択はないブレース拡張を使用する代わりにbashのCスタイルループ- 見るuser000001 の回答

    • 特定の数値が重要ではなく、ループ本体を指定された回数だけ実行する必要がある場合は、コール・ティアニーの答えオプションです。
  • ブレース拡張を使用する場合それでも望ましい:

    • もし、あんたがリスト内の数字に接頭辞または接尾辞、 使用seqユーティリティ引用なしコマンド置換(小さな注意点: seqPOSIXユーティリティではありませんが、広く利用可能です。例:

      • echo $(seq 3)-> 1 2 3; 開始番号1 暗示
        • echo $(seq -f '%02.f' 3)-> 01 02 03- ゼロ埋め
      • echo $(seq 2 4)-> 2 3 4; 明示的な開始番号と終了番号
      • echo $(seq 1 2 5)-> ;1 3 5カスタム増分(2真ん中
    • もし、あんたがリスト内の数字には接頭辞または接尾辞、いくつかの選択肢があります:

      • seqユーティリティの-fオプションを使用して、-styleフォーマット文字列(上記のゼロパディングに使用)を指定するか、 (特別な注意が必要です!)printfに基づく純粋なBash回避策を使用するか、eval配列ループで、その詳細はこの答え
      • また、カスタム シェル関数や、 や などのユーティリティを使用したカスタム スクリプトを作成するなどして、機能を汎用的に実装することも検討できawkますperl

evalシーケンス中括弧式を駆動する変数でのの安全な使用例:

変数は事前に検証され、10 進整数が含まれていることが確認されます。

from=1 to=3  # sample values

# Ensure that $from and $to are decimal numbers and abort, if they are not.
(( 10#$from + 10#$to || 1 )) 2>/dev/null || { echo "Need decimal integers" >&2; exit 1; }

eval echo "A{$from..$to}"  # -> 'A1 A2 A3'

ブレース拡張の概要

ブレース拡張の主な目的トークンのリストを展開する各トークンにはオプションの接頭辞および/または接尾辞; 括弧の展開は引用なしそして入って来る2種類のフレーバー:

  • 1つの固定シリーズカンマで区切られた文字列の(リスト)-変数サポートされている
    • 指定して展開する修理済みトークンの数(2つ以上)例:
    • echo A{b,c,d}-> Ab Ac Ad、つまり、引数の数からわかるように、3 つのトークンです。
    • echo {/,$HOME/}Library例: ->/Library /User/jdoe/Library
    • 変数参照 - さらにはグロブ -サポートされていますが、拡張されることに注意してくださいブレース拡張は、結果通常の評価の過程で。
  • 1つの順序..、を含む式(範囲)通常数値-変数サポートされていません

    • 拡大すると変数トークンの数、駆動力リテラル開始点と終了点(のために歴史的な理由変数の使用はサポートされていません- コメントを見るuser000001 の回答):
      • [レア]文字列: のみ英語の単一文字許可される; 例{a..c}
      • 数字:小数点以下の整数のみ;例: {1..10}、、{10..1}{-1..2}
        • プレフィックスとポストフィックスの例: A{1..3}#->A1# A2# A3#
        • 壊れた変数: {$from..$to} # !! FAILS-$from$to解釈されますリテラルしたがって、単一の文字としても10進整数としても認識されません -いいえブレース拡張が実行されます(下記参照)。
          • 対照的に、変数を使用するする働いzshksh
      • バッシュ4以上2 つの機能を追加します。
        • オプション増分ステップ値:
          • echo A{1..5..2}-> A1 A3 A5- 数字が2ずつ増加
        • 能力ゼロパッド:
          • echo A{001..003}->A001 A002 A003
  • アン無効括弧表現ない拡大(通常の引用符なしの文字列として扱われ、および{}次のように扱われます。リテラル):

    • echo {}-> '{}'- 括弧式としては無効です。少なくとも2 ,- 分離されたトークンが必要
      • これにより、たとえば{}でunquoted を使用できるようになります。find
    • echo {1..$to}-> '{1..<value-of-$to>}'- 括弧式としては無効です。bash変数はサポートされていません。ただし、有効および。kshzsh
    • fish対照的に、拡大するどれでも {...}シーケンス; 同様に、拡張するためのzshオプションBRACE_CCL(デフォルトではオフ)があります個人文字を内部に含むため{..}空でない任意の {...}順序。)

おすすめ記事