2016-03-21 76 views
0

シェル変数からパラメータを渡して呼び出すプログラムがあります。この質問を通じて、私はそれはそれはそれに渡される引数の数を出力しますシェル変数で空白を含むパラメータを渡す

#!/bin/sh 
echo $# 

すなわちで与えられると仮定するつもりです。それをcount-argsとしましょう。

私はこのように私のプログラムを呼び出します。

X="arg1 arg2" 
count-args $X 

これは非常によく動作します。しかし、今では私の議論の一つに空白があり、私はそれを逃れる方法を見つけることができません。以下のものは動作しません:例すべてにおいて

X="Hello\ World" 
X="Hello\\ World" 
X="'Hello World'" 

、私のプログラム2アウトcount-argsプリントを。方法を見つけて、文字列Hello Worldを渡すことができ、代わりに1を返します。どうやって?

わかりやすくするために、すべてのパラメータを単一の文字列として渡す必要はありません。

X="Hello World" 
count-args $X 

は、2を出力します。空白を含むパラメータを渡す方法が必要です。

+0

あなたは自分自身と矛盾しています。 '' 'X =" Hello World "; count-args $ X'''は '' '1'''を出力します。これを実現するには、user1934428: '' '" $ X "' ''のように引用符を使います。この単一の文字列を複数のパラメータとして解釈したい場合は、間違っています:http://mywiki.wooledge.org/BashFAQ/050! – dekkard

+0

@dekkard:私が望むものを正確に行う方法を見つけたので、私の要件は一貫していると確信しています。しかし、そのリンクのおかげで、それは非常に有用です。 –

答えて

2

アウト複数のスペースを含む引数を格納する配列を使用します。

$ args=("first one" "second one") 
$ count-args "${args[@]}" 
2 
2
count-args "$X" 

引用符は、変数Xの内容全体が1つのパラメータとして渡されることを保証します。

+0

これは、 'X'の* value *の特別な処理を必要としないことに注意してください:' X = "Hello World" '空白を含む文字列に' X'を設定し、 'count-args" $ X "' 1つの引数で関数を呼び出します。空白を保持するために、関数内の '$ 1'の展開を引用する必要もあります。 – chepner

+0

これは私が望むものではないと私は思う。すべてのパラメータを単一の文字列として渡す必要はありません。空白を含むパラメータを渡す方法が必要です。私の質問に段落を追加しました。今はっきりしていることを願っています。 –

1

あなたのカウントスクリプト:完全性については

$ cat ./params.sh 
#!/bin/sh 
echo $# 

ここでは、さまざまな引数で何が起こるかです:

$ ./params.sh 
0 
$ ./params.sh 1 2 
2 
$ ./params.sh 
0 
$ ./params.sh 1 
1 
$ ./params.sh 1 2 
2 
$ ./params.sh "1 2" 
1 

そして、ここでは、あなたが変数を得るものです:

これを取る
$ XYZ="1 2" sh -c './params.sh $XYZ' 
2 
$ XYZ="1 2" sh -c './params.sh "$XYZ"' 
1 

さらに少し:

$ cat params-printer.sh 
#!/bin/sh 
echo "Count: $#" 
echo "1 : '$1'" 
echo "2 : '$2'" 

我々が得る:

$ XYZ="1 2" sh -c './params-printer.sh "$XYZ"' 
Count: 1 
1 : '1 2' 
2 : '' 

これは、あなたがやりたいことのように見えます。

Now:スクリプトがある場合、制御することはできず、スクリプトの呼び出し方法も制御できません。次に、スペースが複数の引数に変わるのを防ぐためにできることはほとんどありません。

StackOverflowには、コマンドの呼び出し方法を制御する機能が必要であることを示すかなりの質問があります。

Passing arguments with spaces between (bash) script

Passing a string with spaces as a function argument in bash

Passing arguments to a command in Bash script with spaces

そしてすごいです!これはxargsで解決することができ

How to pass argument with spaces to a shell script function

0

:このは前に何度も頼まれました。

echo $X | xargs count-args 

count-args $X 

を置き換えることによって、私は、例えば、$Xで空白をエスケープするバックスラッシュを使用することができます1と

X="Hello World" 
echo $X | xargs count-args 

プリントアウト

X="Hello\\ World" 
echo $X | xargs count-args 

プリント2.