2013-07-20 41 views
0

我是新手Linux用戶,我遇到了這個問題。

如果下面的命令已被執行

set 10 20 30 40 50 
shift 
shift 

我如何才能找到的$*價值?

+0

你是什麼意思,「找到價值」? –

+0

對不起,我不應該說,「發現」,而是「輸入$ *的價值」 基本上我想找出已執行的命令,我需要得到的價值$ *。 – user2601569

+0

我還是不明白。在你顯示'$ *'的命令後面只是'30 40 50'。 –

回答

0

bash手冊頁:

set:該選項的處理之後剩餘的任何 參數都被 作爲位置參數的值和被分配,在 順序來$1$2,。 .. $n

和:

shift [n]: 從n+1 ...位置參數重命名爲通過數字$#$#-n+1是 未設置代表$1 .... 參數...如果n沒有給出,它假定爲1.

所以你set集:

$1 = 10 
$2 = 20 
$3 = 30 
$4 = 40 
$5 = 50 

然後是shift命令拋出$1和一個洗牌其他$n變量下來。你做兩次,讓你留下:

$1 = 30 
$2 = 40 
$3 = 50 

你可以只使用:echo $*看到輸出:

30 40 50 
0

其有點奇怪.....問題說,值$ * ......的好處代表了放入命令中的所有內容,因此被傳遞到了posistional參數。

換檔命令只會將原來的命令行中的所有內容都推到一個地方......所以從10 20 30 40 50 .....在兩次換檔之後(2次向左推)您已經30 40 50現在可以通過指定位置/ occurence與像$ A $ 1:$ 2

$ set 10 20 30 40 50 
$ shift 2 
$ echo $* 
30 40 50 

把它簡單地訪問....

如果要訪問單個值

....只需使用$ 1,$ 2 ....就像明智一樣,這裏$ 1將有30和$ 2將有40個。

你想知道你有多少個參數使用$#

$ echo $# 
3 

對此有幫助嗎?

2

找到$*值的最簡單方法是呼應它:

echo $* 

考慮所示的三個步驟,它會響應:

30 40 50 

$*不帶引號的值是與不帶引號的[email protected]的值相同,並且由shell腳本的所有位置參數組成,或者由set命令設置的值組成,例如您顯示的值(由後續任何修改命令)。使用雙引號括起來,"$*"表示一個包含所有位置參數的單個字符串,但"[email protected]"表示多個字符串,每個字符串與位置參數相同。這是更爲正確的形式。

您可以看到與printf命令這些形式之間的差別:

printf "%s\n" $* 
printf "%s\n" "$*" 
printf "%s\n" [email protected] 
printf "%s\n" "[email protected]" 

你會得到更深入地瞭解他們,如果你使用:

set -- 10 '20 30' ' 40 50 ' 

沒有任何的變化,然後用4 printf命令:

printf "X%sX\n" $* 
printf "X%sX\n" "$*" 
printf "X%sX\n" [email protected] 
printf "X%sX\n" "[email protected]" 

X的發球標記打印值的開始和結束。輸出是:

X10X 
X20X 
X30X 
X40X 
X50X 
X10 20 30 40 50 X 
X10X 
X20X 
X30X 
X40X 
X50X 
X10X 
X20 30X 
X 40 50 X 

Bash手冊的相關部分是special parameters