2

別のプログラムに変数を渡す必要がある bash スクリプトを作成しています。

./program $variable

問題は、$variable が単一のパラメーターとして渡されることが絶対に必要であり、空白が含まれている場合には当てはまらないことです。

variable=Hello World
./program $variable
-> program receives two arguments: 'Hello' 'World'

それを引用してもまったく何もしません(よくやった、bash開発者):

variable=Hello World
./program "$variable"
-> program receives: 'Hello' 'World'

二重引用符はクレイジーなことをします(よくやった、bash開発者):

variable=Hello World
./program "'$variable'"
-> program receives: "'Hello" "World'"

これを行う簡単な方法はありますか?一体、これを行う方法はありますか?

更新:わかりました。問題は bash にあるようには見えないので、ここに追加情報を示します。引数を渡すプログラムは Python スクリプトです。引数をまったく変更せずに、私は得る

print sys.argv
-> ['/usr/bin/program', "'Hello", "World'"]

どうすれば修正できますか?

編集:いいえ、試していません

variable="Hello World"

$variable を宣言しないからです。bash 関数内で宣言されておらず、変更することはできません。

編集:わかりました、そのように動作するようになりました。

local temp="$variable"
./program "$temp"

ただし、他の方法ではなく、そのように機能する理由を知りたいです。

4

5 に答える 5

1

で試しましたvar="hello world"か?

私はsolarisボックスでこれを試しました。

> setenv var "hello world"
> cat temp.sh
#!/bin/sh

echo $1
echo $2
> ./temp.sh "$var"
hello world

>

ご覧のとおり、$2印刷されていません。$varは 1 つの引数のみと見なされます。

于 2012-10-22T08:40:24.993 に答える
1

スクリプトを呼び出すときは、引数を引用符で囲みます。

スクリプト例:

#!/bin/bash
for arg in "$@"; do
 echo "arg: $1";
 shift;
done

あなたがそれを呼び出すとき:

./program "parameter with multiple words" parameter2 parameter3 "another parameter"

出力は次のようになります。

arg: parameter with multiple words
arg: parameter2
arg: parameter3
arg: another parameter
于 2012-10-22T08:40:30.003 に答える
1

http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_03_04.htmlをご覧ください。

問題は、変数の展開がコマンド ライン パラメーターの前に行われるため、動作することです。

次のように IFS を奇妙なものに設定することで、それを回避することができます。

IFS='###' V='foo bar baz'; ./program $V 
于 2012-10-22T08:58:51.267 に答える
0

これは、プログラムで変数を読み取る方法の問題であることはほぼ間違いありません。
たとえば、これがスクリプトであるとします(テスト用に1行だけ)。

echo "$1"

それをecho.shと呼びましょう。を実行するecho.sh "test best"と、が取得されますtest best

しかし、あなたのプログラムが言うなら

echo $1

あなたが見ているような行動をとる可能性があります。

于 2012-10-22T08:32:39.413 に答える
0

問題は「プログラム」内にあるようです

variable="Hello World"    # quotes are needed because of the space
./program "$variable"     # here quotes again

そしてプログラムの中で

echo "program received $# arguments:" 
i=1
for arg in "$@"      # again quotes needed
do echo "arg $((i=i+1)): '$arg'"    # and again
done
于 2012-10-22T08:40:21.940 に答える