2012-10-22 106 views
1

我正在寫有一個bash腳本的變量傳遞到另一個程序:擊:傳遞變量作爲一個參數/殼報價參數

./program $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" 

,因爲我從來沒有宣佈$變量。它沒有在我的bash函數中聲明,我不允許修改它。

編輯:好吧,我得到它的工作方式。

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

我想知道爲什麼它的工作方式,而不是任何其他方式,但。

+1

的問題是在「方案」角落找尋解決它; './program「$ variable」'傳遞一個可以包含空格的參數,程序正在做什麼? –

+2

你試過用'variable =「Hello World」' – Vijay

+0

@sarathi:不,因爲我實際上從不聲明$變量。我只是通過它。 –

回答

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 "[email protected]"  # again quotes needed 
do echo "arg $((i=i+1)): '$arg'" # and again 
done 
0

這幾乎肯定是您讀取程序中變量的方式中的一個問題。
例如想這是你的腳本(用於測試只有一行):

echo "$1" 

我們稱之爲echo.sh.如果您運行echo.sh "test best",您將獲得test best

但是,如果你的程序說

echo $1 

你可能會得到像你所看到的行爲。

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

當你調用你的腳本傳遞引號內的參數。

示例腳本:

#!/bin/bash 
for arg in "[email protected]"; 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 
1

http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_03_04.html看看。

問題是變量的擴展是在命令行參數之前完成的,因此您的行爲。

你可能會與IFS設置一些奇怪的

IFS='###' V='foo bar baz'; ./program $V 
+0

感謝您的鏈接和解釋。看看這個指南,它看起來像我永遠不會喜歡bash。 –