7

したがって、任意の数のコマンドライン引数を取り、それらを単一の文字列に入れる必要があるbashスクリプトがあります

ユーザーが入力する内容の例:

give <environment> <email> <any number of integers separated by spaces>
give testing stuff@things.com 1 2 3 4 5

$3 から $# までのすべての引数を取得し、それらを文字列に連結したいと考えています。

現在の私の(おそらくひどい)解決策は

if [ $# -gt 3 ]
then
    env="env="$1
    email="email="$2
    entList=""

    for i in {3..$#}
    do
        if [ $i -eq 3 ]
            then
                    entList=$3
                    shift
            fi;
            if [ $i -gt 3 ]
            then
                    entList=$entList","$3
                   shift
            fi;
     done
fi;

引数が 3 つしかない場合は、少し異なる方法で処理しますが、その 1 つは正常に機能します。

$entList与えられた例の最終値は次のようgive testing stuff@things.com 1 2 3 4 5になります。1,2,3,4,5

今これを実行すると、次のエラーが発生します。

/usr/local/bin/ngive.sh: line 29: [: {3..5}: integer expression expected
/usr/local/bin/ngive.sh: line 34: [: {3..5}: integer expression expected

29 行目と 34 行目は次のとおりです。

line 29: if [ $i -eq 3 ]
line 34: if [ $i -gt 3 ]

どんな助けでも大歓迎です。

4

3 に答える 3

6

あなたは正しい軌道に乗っています。これが私の提案です:

if [ $# -ge 3 ]; then

  env="$1"
  email="$2"
  entlist="$3"

  while shift && [ -n "$3" ]; do
    entlist="${entlist},$3"
  done

  echo "entlist=$entlist"

else

  echo "Arguments: $*"

fi

変数は常に引用符で囲む必要があることに注意してください。を設定した理由はわかりませんがenv=env=$1、後でその値をリサイクルしたい場合は、変数をステートメントであるかのように評価するのではなく、プログラムで行う必要があると思います。

于 2012-06-22T15:34:22.013 に答える
5

サブ配列を使用して最初の 3 つの引数をスキップします。

all=( ${@} )
IFS=','
threeplus="${all[*]:3}"
于 2012-06-22T16:16:26.527 に答える
3

これらのエラー メッセージが表示される理由は次のとおりです。

for i in {3..$#}

ブレース展開はパラメーター展開の前に実行されるため、次のifステートメントは次のように評価されます。

if [ {3..$#} -eq 3 ]

これは有効ではありません。

forC スタイルを使用するようにステートメントを変更します。

for ((i = 3; i <= $#; i++))

整数比較には次のスタイルを使用します。

if (( $# > 3 ))

if (( i == 3 ))

if (( i > 3 ))

パラメータを引用符で囲みます。

env="env=$1"
email="email=$2"

entList="$entList,$3"

ただし、割り当ての右側で単語分割が実行されず、空白、セミコロン、パイプなどの特殊文字を割り当てていないため、引用符は必要ありません。

于 2012-06-22T16:31:28.743 に答える