#!/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
動作しません。 はhowmany
5 に等しくなります。これは、出力にgrep -c
表示される値です。 $1 は、スクリプトを実行するときに指定されるパラメーター 1 です。
何か案は?
ベストアンサー1
回避策シーケンス中括弧式で変数を使用できない理由:
もしその意図が単に範囲内の数値を反復処理する- OPの場合のように -最良の選択はないブレース拡張を使用する代わりにbashのCスタイルループ- 見るuser000001 の回答。
- 特定の数値が重要ではなく、ループ本体を指定された回数だけ実行する必要がある場合は、コール・ティアニーの答えオプションです。
ブレース拡張を使用する場合はそれでも望ましい:
もし、あんたがリスト内の数字に接頭辞または接尾辞、 使用
seq
ユーティリティ引用なしコマンド置換(小さな注意点:seq
POSIXユーティリティではありませんが、広く利用可能です。例: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進整数としても認識されません -いいえブレース拡張が実行されます(下記参照)。- 対照的に、変数を使用するする働い
zsh
てksh
。
- 対照的に、変数を使用するする働い
- プレフィックスとポストフィックスの例:
- バッシュ4以上2 つの機能を追加します。
- オプション増分ステップ値:
echo A{1..5..2}
->A1 A3 A5
- 数字が2ずつ増加
- 能力ゼロパッド:
echo A{001..003}
->A001 A002 A003
- オプション増分ステップ値:
- [レア]文字列: のみ英語の単一文字許可される; 例
- 拡大すると変数トークンの数、駆動力リテラル開始点と終了点(のために歴史的な理由、変数の使用はサポートされていません- コメントを見るuser000001 の回答):
アン無効括弧表現はない拡大(通常の引用符なしの文字列として扱われ、および
{
は}
次のように扱われます。リテラル):echo {}
->'{}'
- 括弧式としては無効です。少なくとも2,
- 分離されたトークンが必要- これにより、たとえば
{}
でunquoted を使用できるようになります。find
- これにより、たとえば
echo {1..$to}
->'{1..<value-of-$to>}'
- 括弧式としては無効です。bash
変数はサポートされていません。ただし、有効および。ksh
zsh
- (
fish
対照的に、拡大するどれでも{...}
シーケンス; 同様に、拡張するためのzsh
オプションBRACE_CCL
(デフォルトではオフ)があります個人文字を内部に含むため{..}
、空でない任意の{...}
順序。)