2

3 つの引数を必要とするシェル スクリプトを実行したいと考えています。

引数番号 2 には、スペースを含む文字列が含まれています

次のように、すべての引数を 1 つの変数に入れたいとします。

Linux:~# kk="\"111\" \"222 222\" \"333\""
Linux:~# echo $kk
"111" "222 222" "333"

関数を呼び出すと、次のようになります。

func() {
  echo ---$1---
  echo ---$2---
  echo ---$3---
}

このように $kk 変数を使用して

func $kk

そしたら返ってくる

Linux:~# func $kk
---"111"---
---"222---
---222"---

そして、私はこの結果が得られることを期待していました

---111---
---222 222---
---333---

を使用せずにこの問題を解決するにはeval?

この問題を解決することはわかっていevalますが、使用したくありません (そのような呼び出しを何度も実行すると時間がかかるため)。

4

2 に答える 2

3

OP はもともと question というタグを付けていましたが、その後タグを削除しました。POSIX シェル ソリューションについては、Charles Duffy の素晴らしい回答を参照してください。にのみ適しています。


このような文字列ではなく、配列にデータを入れる必要があります。ところで、関数にいくつかの引用符がありません:

func() {
    echo "---$1---"
    echo "---$2---"
    echo "---$3---"
}

またはさらに良い( よりprintfも望ましいecho):

func() {
    printf -- '---%s---\n' "$1"
    printf -- '---%s---\n' "$2"
    printf -- '---%s---\n' "$3"
}

$ kk=( "111" "222 222" "333" )
$ func "${kk[@]}"

喜んで印刷します:

---111---
---222 222---
---333---

引数に改行などを含めることもできます。

$ kk=( $'one\none' "222 222" $' *   three\nthree' )
$ func "${kk[@]}"
---one
one---
---222 222---
--- *   three
three---
于 2015-02-16T13:56:21.943 に答える