支柱を拡張する前にパラメータ拡張を実行しますか? [コピー]

支柱を拡張する前にパラメータ拡張を実行しますか? [コピー]

Bashのマニュアルは、中かっこ拡張が他の拡張よりも先に実行されることを示しています。

私は2つのパラメータを受け入れるスクリプトを書いています。

#! /bin/bash

for b in {$1..$2}; do echo $b; done

私は次のように実行します:

$ ./myscript 0002 0010
{0002..0010}

出力は私が期待していたものとは異なります。中かっこ拡張の前にパラメータ拡張を実行したいと思います。私の例の予想結果は0002 0003 0004 0005 0006 0007 0008 0009 0010、noです2 3 4 5 6 7 8 9 10。代わりに何を使用しますか{$1..$2}

私はこの解決策が数字だけでなく、文字と数字からなる文字列$1でも機能したいと思います。$2

$1and 値は$2スクリプトの引数としてのみ指定できます。最初から明確だと思いますが、万が一に備えてご指摘ください。

答え1

要求どおりに実行してください。中かっこを拡張する前にパラメータ拡張を実行してください。

中括弧の拡張を遅らせる必要があります。\{...\}これを引用してevalを呼び出すと、簡単に実行できます。

$ set -- 5 10
$ eval printf \'%s \' \{$1..$2\}
5 6 7 8 9 10

または にコマンドがない場合は$1正常に動作します$2
これはこのソリューションのセキュリティリスクです。この問題を軽減する1つの方法は、変数に数字のみを含めることです。

#!/bin/bash

a=${1//[^0-9]/}          ### select only numbers from first parameter.
b=${2//[^0-9]/}          ### select only numbers from second parameter.

c=$(eval printf \'%s \' \{$a..$b\})

for i in $c; do echo "$i"; done

上記のコードには、このバージョンで修正されたいくつかの参照がありません。

#!/bin/bash
a=${1//[^0-9]/}          ### select only numbers from first parameter.
b=${2//[^0-9]/}          ### select only numbers from second parameter.
c=( $(eval printf \'%s \' \{$a..$b\}) )

for i in "${c[@]}"; do echo "$i"; done

### Or just
# printf '%s\n' "${c[@]}"

しかし、数値リストを印刷するには、算術forループがより良い解決策のように見えます。

#!/bin/bash

a=${1//[^0-9]/}          ### select only numbers from first parameter.
b=${2//[^0-9]/}          ### select only numbers from second parameter.

for (( i=$a; i<=$b; i++)); do
    printf '%0*d\n' 5 "$i"
done    

次のように使用してください。

$ script.sh 5 15
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015

答え2

サポート拡張POSIXで定義されていないので、完全に削除することもできます。

seq $*

または:

j=$1
while [ $j -le $2 ]
do
  echo $j
  j=$((j+1))
done

または:

echo $* | awk '{for (j = $1; j <= $2; j++) print j}'

答え3

#! /bin/bash

seq -w $1 $2

これがあなたが見つけたものかもしれません!

関連情報