2016-03-21 87 views
0

我有一個程序,我想通過傳遞來自shell變量的參數來調用。在整個這個問題中,我將假設它是由通過shell變量傳遞包含空格的參數

#!/bin/sh 
echo $# 

即它打印出傳遞給它的參數的數量。我們稱之爲count-args

我把我的計劃是這樣的:

X="arg1 arg2" 
count-args $X 

這工作得很好。但是現在我的一個論點裏面有一個空白空間,我無法找到逃避它的方法,例如,下面的東西不起作用:

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

在所有的情況下,我的程序count-args打印出2。我想找到一種方法,以便我可以傳遞字符串Hello World,並且它返回1。怎麼樣?

只是澄清:我不想將所有參數作爲單個字符串傳遞,例如

X="Hello World" 
count-args $X 

應打印出來2。我想要一種傳遞包含空格的參數的方法。

+0

你自相矛盾。 '''X =「Hello World」; count-args $ X'''應該打印出'''1'''。爲了實現這個用戶引用,用戶1934428顯示:'''「$ X」'''。如果你希望將這個單個字符串解釋爲多個參數,那麼你就會犯這個錯誤:http://mywiki.wooledge.org/BashFAQ/050! – dekkard

+0

@dekkard:由於我找到了一種方法來完成我想要的任務,我相信我的要求是一致的。但是,感謝那個鏈接,這非常有幫助。 –

回答

2

使用一個數組來存儲多個含有空間參數。

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

引號確保在bash中變量X的全部內容作爲單個參數傳遞。

+0

值得注意的是,這不需要對'X'的*值*進行任何特殊處理:'X =「Hello World」'將'X'設置爲包含空格和'count-args'的字符串$ X「'用一個參數調用該函數。您還需要在函數內引用'$ 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 : '' 

這看起來像你想要做什麼。

現在:如果你有一個腳本,你無法控制,也不能控制腳本被調用的方式。那麼你可以做的很少,以防止一個空格變成多個參數的變量。

在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

而且哇!

How to pass argument with spaces to a shell script function

0

這可以用xargs解決:這被要求之前這麼多次。通過用

echo $X | xargs count-args 

替換

count-args $X 

我可以使用反斜槓逃避$X空格,例如

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

打印出1和

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

打印出2.

相關問題