簡體   English   中英

將帶有單引號和雙引號的參數傳遞給Shell腳本

[英]Passing an argument with single and double quotes to shell script

我們試圖將帶有單引號和雙引號的參數傳遞給Shell腳本並使用該參數執行。 回顯其打印正確,但是對於命令,我們得到的是“未終止的引用值”

請參閱腳本和參數傳遞方法:

[root@geopc]/root# ./myscript.sh 'localhost:9199/jmxrmi -O java.lang:type=GarbageCollector,name="PS MarkSweep" -A CollectionCount -K duration'


#!/bin/bash
out=`/usr/lib64/nagios/plugins/check_jmx -U service:jmx:rmi:///jndi/rmi://$1`
echo $1
echo $out

執行后,我們得到的輸出為

$ 1:本地主機:9199 / jmxrmi -O java.lang:type = GarbageCollector,name =“ PS MarkSweep” -A CollectionCount -K duration

$ out:JMX CRITICAL無終止報價

在Shell Script中,我們對$ 1的值進行硬編碼,然后執行,即可得到正確的結果。

我們嘗試傳遞參數如下:

./myscript.sh 'localhost:9199/jmxrmi -O java.lang:type=GarbageCollector,name=\"PS MarkSweep\" -A CollectionCount -K duration'

在這種情況下,錯誤是:JMX CRITICAL屬性的值部分中的無效字符'“'

./myscript.sh 'localhost:9199/jmxrmi -O java.lang:type=GarbageCollector,name="\"PS MarkSweep\"" -A CollectionCount -K duration'

在這種情況下,錯誤是JMX CRITICAL未終止的引用值

所以任何人都可以幫助我。

問題是您期望變量中的引號和轉義符與腳本中的引號解釋相同。

用Java術語,這與預期相同:

String input="\"foo\", \"bar\"";
String[] parameters = { input };

與此相同:

String[] parameters = { "foo", "bar" };

兩種語言的真正解決方案是讓輸入為元素數組:

#!/bin/bash
out=`/usr/lib64/nagios/plugins/check_jmx -U service:jmx:rmi:///jndi/rmi://"$1" "${@:2}"`
echo "$1"
echo "$out"

然后運行:

./myscript.sh localhost:9199/jmxrmi -O java.lang:type=GarbageCollector,name="PS MarkSweep" -A CollectionCount -K duration

然而!!

這需要紀律和理解。

您會注意到,這不是一個嵌入式解決方案:該腳本現在使用多個參數進行調用。 這是一個非常嚴格的要求。 如果另一個程序正在調用此腳本,則該程序也必須意識到這一點。 它需要端到端處理。

例如,如果將其存儲在配置文件中,則您有責任以可以反序列化為列表的方式來序列化字符串。 您不能只是希望它會成功,因為它不會。 與Java不同,當您混淆字符串和列表時,不會出現編譯器警告。

如果這不是您要參與的事情,則可以使用eval 由於安全性和健壯性問題,這是一個不好的做法,但有時足夠好:

yourcommand="/usr/lib64/nagios/plugins/check_jmx -U service:jmx:rmi:///jndi/rmi://$1"
echo "$yourcommand"  # Make sure this writes the right command
eval "$yourcommand"  # This will execute it as if you copy-pasted it

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM