1

myscript.sh のオプションとして spaced を含む文字列値を渡す必要があります。コードは次のようになります。

while getopts "m:i:t:" OPTION
do
 case $OPTION in
     m)
         M=$OPTARG
         echo M: $M
         ;;
     i)
         I=$OPTARG
         echo I: $I
         ;;
     t)
         T=$OPTARG
         echo T: $T
         ;;
     ?)
         usage
         exit
         ;;
 esac
done

コマンドラインで直接呼び出すと、問題なく動作します。

./myscript.sh -m 1 -i '0 1 2 3' -t '2142'
M: 1
I: 0 1 2 3
T: 2142

ただし、 -i を文字列変数として渡す必要があり、動作させることができません。オプション -i の文字列は切り詰められ、オプション -t も表示されません (おそらく改行)。

I='0 1 2 3'
./myscript.sh -m 1 -i "'"$I"'" -t '2142'
M: 1
I: '0

I='0 1 2 3'
II="'"$(echo $I)"'"
./myscript.sh -m 1 -i $II -t '2142'
M: 1
I: '0

助言がありますか?ありがとう!

4

1 に答える 1

3

実行しようとすると、なぜそのように引用するのですか? これは、これがあなたが意図したことであると確信しています:

./myscript.sh -m 1 -i "$I" -t 2142

二重引用符は、その中のすべての文字をリテラルとして扱います$。単一引用符は、変数の展開も停止します。それらはそれぞれ他のタイプの引用を保護するので、それ"'"は単なる'文字であり、'"'単なる"文字です.

これは、単一引用符に特別な意味はなく、スペースの保護もなく、"'"$I"'"が になること'0 1 2 3'を意味します - と書くこともできます\'0 1 2 3\'。保護されていないスペースは単語を分割するため、最初の単語は\'0. したがって、スクリプトはそれをオプションの値として認識し、 and 12、および3'を追加の引数として認識します。これは、while ループの後にshift $((OPTIND - 1))、解析されたオプションをシフトするために追加しecho "arguments: $@"、オプションの解析後に追加するとわかります。getopsまた、はすべてのオプションが先頭にあることを期待しているため、オプションを見逃してしまい-t、それも引数として扱っていることがわかります。

于 2012-02-16T18:27:19.993 に答える