二重引用符で囲みます。
do_X_with "$2"
二重引用符は、最初の値に改行がある場合は改行を含め、変数の内部間隔を保持します。確かに、配列を使用する場合は言うまでもなく、"$@"
との二重引用符の使用法を理解することも重要です。"$*"
bash
do
シェルがdo
ループ構造でキーワードとして使用するため、コマンドを簡単に呼び出すことはできません。これを呼び出すには、./do
またはなどのコマンドへのパスを指定する必要があります$HOME/bin/do
。
しかし、$ 2は「これ」であり、OPはそれを「スペースを含むこのコマンド」にすることを望んでいます。
わかった。コマンドラインの呼び出しと望ましい動作を確認する必要があります。実行中のスクリプトがと呼ばれると仮定しましょうscript
。さらに、実行されているそのコマンドはothercommand
(使用できませんcommand
;それは標準コマンドです)です。
可能な呼び出しは次のとおりです。
script sendcommand "this command with spaces"
script sendcommand 'this command with spaces'
script sendcommand this command with spaces
この例では、一重引用符と二重引用符の呼び出しは同等です。展開する変数や引数リスト内で呼び出すコマンドがある場合、これらは同等ではありません。
script
3つのケースすべてを処理するように書くことができます。
#!/bin/bash
case "$1" in
sendcommand)
shift
othercommand "$*"
exit
;;
esac
呼び出しが引数を引用符で囲んでいると仮定します。このshift
コマンドは$1
引数リストから削除し、残りの(単一の)引数に。として番号を付け直します$1
。othercommand
次に、一緒に連結された引数の内容で構成される単一の文字列引数を使用して呼び出します。複数の引数がある場合、内容は単一の「スペース」(の最初の文字)で区切られ$IFS
ます。
呼び出しで引数が引用符で囲まれていないとします。このコマンドは、引数リストから( )をshift
削除し、残りの引数を1つの引数としてスペースで区切ります。$1
sendcommand
3つのケースすべてで、othercommand
はで構成される単一の引数を"this command with spaces"
参照します(もちろん、プログラムは二重引用符を認識しません)。