2011-06-17 72 views
1

我試圖寫一個bash腳本,將檢查的第一個參數,如果特定值的公司之一,那麼它會從參數中刪除該參數,並設置一些東西了:

#!/bin/bash -x 

echo [email protected] 

if [ "$1" == "valgrind" ]; then 
    echo running under valgrind 
    set $tool=valgrind 
    shift 1 
elif [ "$1" == "debug" ]; then 
    echo running under gdb 
    set $tool=gdb --args 
    shift 1 
else 
    echo running normally 
    set $tool="" 
fi 

echo tool=$tool 
echo [email protected] 

但是,當我運行它會消耗所有參數!例如: -

./my_script valgrind --something=y -r 

+ echo args=valgrind --something=y -r 
args=valgrind --something=y -r 
+ '[' valgrind == valgrind ']' 
+ echo running under valgrind 
running under valgrind 
+ set =valgrind 
+ shift 1 
+ echo tool= 
tool= 
+ echo args= 
args= 

,如果if語句不遵循:

./my_script valgrindx --something=y -r 

+ echo args=valgrindx --something=y -r 
args=valgrindx --something=y -r 
+ '[' valgrindx == valgrind ']' 
+ '[' valgrindx == debug ']' 
+ echo running normally 
running normally 
+ set = 
+ echo tool= 
tool= 
+ echo args== 
args== 

發生了什麼,以及如何解決它?

回答

4

這是因爲set blah blah blah實際上是設置$1 ... $N參數無論參數計算結果爲,如下面的成績單:

pax$ echo $1 

pax$ set $tool=hello ; echo $1 
=hello 

pax$ tool=xyzzy ; set $tool=hello ; echo $1 
xyzzy=hello 

(在第二個命令,$tool爲什麼它出來的沒有設置這空白)。

在你的情況,set $tool=valgrind被設置$1到任何字符串$tool=valgrind計算結果爲,這就是爲什麼[email protected]正在發生變化。它是而不是設置環境變量toolvalgrind

如果你想設置的變量,只需使用:

tool=valgrind 

,或者將其提供給子shell:

export tool=valgrind 

set命令用於任何顯示環境的東西或者設置shell屬性和參數,而不是命名變量。如果你看看man bash_builtins手冊頁,你會看到解釋這種行爲位(搜索的set說明):

任何後處理的值被視爲對位置的選擇剩餘的參數參數並按順序分配到$1, $2, ... $n

2
set $tool=valgrind 

應該

tool=valgrind 

set命令是別人在bash的東西,嘗試 '幫助集'。

0

set $tool=valgrind應該只是tool=valgrindset在Bash/Bourne兼容shell中與在C shell中有不同。

0

您也應該檢查getopts,以便對-x argument進行處理。 See here

相關問題