関数に複数の引数を渡そうとしていますが、引数の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
答え1
2番目のパラメータのみを引用する必要があります。
myfunc(){
echo "$1"
echo "$2"
echo "$3"
}
myfunc hi "hello guys" bye
答え2
これはシェル(シェルスクリプト、Cプログラム、Pythonプログラム...)から何でも呼び出すのと同じです。
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("$@")
スクリプトにはどのスペースがあるのか(どの単語が一緒に行くのか)わからないため、スクリプトを自動化する方法はありません。