2012-11-01 56 views
1

以下shell腳本將當前目錄更改爲桌面。在shell腳本中,如何用變量安全地更改當前目錄?

v=~/Desktop/ 
cd $v 
pwd # desktop 

以下腳本將當前目錄更改爲主目錄而不是生成錯誤。

cd $undefined_variable 
pwd # home directory 
echo $? # 0 

恐怕腳本會刪除重要文件,如果我拼錯變量爲新的當前目錄。

一般來說,你如何在shell腳本中安全地改變當前目錄中的變量?

回答

1

可以set -u在每次擴大未定義的變量時使bash退出一個錯誤。

+0

其他的答案也是偉大的,但'設置-u'是最簡單的解決方案。謝謝! –

1

您可以使用test -d條件(檢查指定的變量是否是一個目錄),即

if [[ -d $undefined_variable ]] 
then 
    cd $undefined_variable 
    echo "This will not be printed if $undefined_variable is not defined" 
fi 

又見here進一步測試選項...

0

是的,那是殼
如果你輸入cd沒有參數,它會跳轉到主目錄。 您可以在命令cd之前檢查空或空變量。

檢查像(CD只能被稱爲如果TARGETDIR不爲空):

test -z "$targetDir" || cd $targetDir 

檢查像(CD只有在TARGETDIR真的存在所謂的):

test -d "$targetDir" && cd $targetDir 

注:謝謝對於-1,也應該讀最後一句。所以我增加了真正的答案。

1

伯恩殼有一個結構來代替未定義變量的值,${varname-subtitution}。您可以使用此有萬一變量未定義安全後備目錄:

cd "${undefined-/tmp/backupdir}" 

如果有一個名爲undefined變量,它的值將被替換,否則/tmp/backupdir被取代。

請注意,我也把雙引號中的變量擴展。這是用來防止字含有空格的字符串分割(適用於Windows目錄很常見)。這種方式甚至可以用於具有空格的目錄。

有關所有shell替換結構(POSIX shell有7個以上)的詳細信息,請參閱您的shell手冊的參數替換部分。

+0

感謝您提供有用的信息!我不知道有像參數替代這樣很酷的功能。我應該多學習shell腳本。 –

2

用途:

cd ${variable:?}

如果$變量未定義或爲空,則bash將拋出一個錯誤,然後退出。它就像set -u選項,但不是全局文件。

+0

你也可以提供一個錯誤信息:'$ {variable:?變量未設置或爲空}' –

1

你必須包裝(這項工作在bash):

cd() { 
    if [ $# -ne 1 ] ;then 
     echo "cd need exactly 1 argument" >&2 
     return 2 
     fi 
    builtin cd "$1" 
}