web-dev-qa-db-ja.com

シェルスクリプト関数にスペースを含む引数を渡す方法は?

関数に複数の引数を渡そうとしていますが、そのうちの1つは2つの単語で構成されており、シェル関数で1つの引数として処理する必要があります。

args=("$@")
function(){
 echo ${args[0]}
 echo ${args[1]}
 echo ${args[2]}
}

このコマンドを呼び出すとsh Shell hi hello guys bye

私はこれを手に入れます

hi

hello

guys

しかし、私が本当に欲しいのは:

hi 
hello guys
bye
17
user78050

2番目の引数を引用するだけです。

myfunc(){
        echo "$1"
        echo "$2"
        echo "$3"
}

myfunc hi "hello guys" bye
16
sillyMunky

シェルから何かを呼び出すのと同じです(シェルスクリプト、Cプログラム、a python program、…))

Unixシェルから呼び出し、パラメータにスペースがある場合は、引用符で囲む必要があります。

sh my-Shell-script hi "hello guys" bye

一重引用符を使用することもできます。これらはより強力です。シェルが何かを解釈しないようにします($!\*"など、'を除く)

sh my-Shell-script hi 'hello guys' bye

また、関数内で使用するすべての変数を引用する必要があります。

あなたの例では、関数に到達する前に引数がばらばらになっていることに注意してください(スクリプトに渡されるため)。

#!/bin/sh
my_procedure{
   echo "$1"
   echo "$2"
   echo "$3"
}
my_procedure("$@")

スクリプトでどのスペースがどの(どの単語が一緒になっている)かを知る方法がないため、スクリプトでそれを自動的に行う方法はありません。

8
ctrl-alt-delor