2014-10-19 59 views
2

採取bash腳本wtf.sh可能在Bash中將文字字符*作爲命令行參數傳遞?

#!/bin/bash 
echo $1 
echo $2 
echo $3 
./wtf.sh 1 2 3 
1 
2 
3 

./wtf.sh * * * 



end 

./wtf.sh 1 * * 
1 
wtf.sh 
wtf.sh 

./wtf.sh 1 "*" "*" 
1 
wtf.sh 
wtf.sh 

我知道,*是猛砸特殊參數但這是否意味着它不可能通過本身傳遞*從文字字符命令行?我期待的是

./wtf.sh * * * 
* 
* 
* 

我該如何做到這一點?

回答

5

您可以通過文字*由:

  • 把它放在引號:"*"

  • 把它撇號:'*'

  • 反斜槓它:\*

這些都是等價的(在這種情況下)。

,沒有工作的原因是,你的腳本有一個問題:當你不引用$1(和$2$3),你告訴執行路徑擴展和分詞就其內容的外殼。這實際上幾乎不是你想要的 - 在這種情況下顯然不是你想要的。所以,你的腳本應該閱讀:

#!/bin/bash 
echo "$1" 
echo "$2" 
echo "$3" 

這裏,參數必須用雙引號("$1"),它允許參數擴展發生被包圍,但抑制路徑名擴展和分詞。

+0

我剛剛對「」的修改進行了測試,結果仍然相同。也就是說,如果除了腳本修改之外,我還能夠獲得預期的輸出結果,我還在命令行的每個星號周圍添加了引號./wtf.sh「*」,輸出爲*。感謝您的澄清。 – Peter 2014-10-19 00:51:55

+0

@彼得:是的,你需要在兩個地方報價。您需要引用'*',以便它不在命令行中擴展,*和*您需要引用'$ 1',以便擴展不是全局擴展的。我試圖讓答案更清楚。 – rici 2014-10-19 01:45:28

+0

反斜槓對我完美地工作!非常感謝! :) – CodingInCircles 2016-02-05 21:42:59

0

如果要傳遞*作爲命令行選項的一個值,並使用getopt然後就可以使用-S*,其中-S是命令行選項和*是其值提取命令行選項。請注意,S*之間沒有空格。如果你給空間,路徑擴展會自動發生。

+0

看來你並不理解問題和問題:rici的答案發現了主要問題(不幸的是,人們試圖在shell中編程的最常見問題):缺乏引號! – 2016-02-17 09:57:32

相關問題