シェルスクリプト関数にスペースを含むパラメータを渡すには? [コピー]

シェルスクリプト関数にスペースを含むパラメータを渡すには? [コピー]

関数に複数の引数を渡そうとしていますが、引数の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("$@")

スクリプトにはどのスペースがあるのか​​(どの単語が一緒に行くのか)わからないため、スクリプトを自動化する方法はありません。

関連情報