1

私は現在bashスクリプトを持っています。次のようになります。

#!/bin/bash

case "$1" in
    sendcommand)
        do X with $2
        exit
        ;;
esac

$ 3、$ 4などとして機能this command with spacesせずに、すべてのコマンドを$ 2に送信するにはどうすればよいですか?PHPやJavascriptのbash用のencodeURIのようなものはありますか?commandwith

4

3 に答える 3

6

また、2番目の引数を引用符で囲んでスクリプトを呼び出す必要があります

./scriptname sendcommand "command with spaces"

スクリプトは次のようになります

#!/bin/bash

case "$1" in
    sendcommand)
        something "$2"
        exit
        ;;
esac
于 2012-07-03T20:42:04.843 に答える
2

二重引用符で囲みます。

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

この例では、一重引用符と二重引用符の呼び出しは同等です。展開する変数や引数リスト内で呼び出すコマンドがある場合、これらは同等ではありません。

script3つのケースすべてを処理するように書くことができます。

#!/bin/bash

case "$1" in
    sendcommand)
        shift
        othercommand "$*"
        exit
        ;;
esac

呼び出しが引数を引用符で囲んでいると仮定します。このshiftコマンドは$1引数リストから削除し、残りの(単一の)引数に。として番号を付け直します$1othercommand次に、一緒に連結された引数の内容で構成される単一の文字列引数を使用して呼び出します。複数の引数がある場合、内容は単一の「スペース」(の最初の文字)で区切られ$IFSます。

呼び出しで引数が引用符で囲まれていないとします。このコマンドは、引数リストから( )をshift削除し、残りの引数を1つの引数としてスペースで区切ります。$1sendcommand

3つのケースすべてで、othercommandはで構成される単一の引数を"this command with spaces"参照します(もちろん、プログラムは二重引用符を認識しません)。

于 2012-07-03T20:00:16.980 に答える
2

二重引用符を使用できます。

do X with "$2"
于 2012-07-03T20:00:39.797 に答える