2013-04-18 34 views
22

很明顯,使用shell腳本編程,這種事情可以通過很多方式完成(比絕大多數編程語言),因爲所有不同的變量擴展的方法和程序,如test[[[Bash:如何從參數中設置一個變量,並使用默認值

現在我只是在尋找

DIR=$1 or . 

含義,我的DIR變量應包含什麼是在第一個參數指定或當前目錄。

this和DIR=${1-.}有什麼區別?

我發現連字符語法混亂,並尋求更可讀的語法。

爲什麼我不能這樣做?

DIR="$1" || '.' 

我猜這意味着「如果$ 1爲空,分配仍然有效(DIR變爲空),所以無效命令'。'永遠不會被執行。「

+0

我發現我的答案是冒號的含義:http://wiki.bash-hackers.org/syntax/pe#use_a_default_value – 2013-04-18 05:07:26

+2

擁抱語言。並非所有的語言都有相同的習語。 'DIR = $ {1: - 。}'是在任何POSIX兼容shell中表達這種邏輯的完美自然方式。 – chepner 2013-04-18 12:26:36

+1

我發現downvote是完全合理的。我不喜歡我寫這個問題的方式。我猜,那時我很沮喪。但是自從我發佈這個版本以來,我從來沒有遇到過任何記憶'$ {VAR:-default}'語法的麻煩。我要編輯我的問題,以減少它。我相信你不是downvoter @chepner,但你是絕對正確的! – 2017-02-02 19:29:16

回答

38

我在這裏看到幾個問題。

  1. 「我能寫的東西,實際上反映了這一邏輯」

    是。有幾種方法可以做到這一點。這裏有一個:

    if [[ "$1" != "" ]]; then 
        DIR="$1" 
    else 
        DIR=. 
    fi 
    
  2. 「是什麼這個和DIR=${1-.}之間的區別?」

    語法${1-.}擴展到.如果$1沒有設置,但擴展像$1如果$1設置,即使$1是設置爲空字符串。

    如果$1未設置或設置爲空字符串,語法${1:-.}將擴展爲.。如果$1設置爲空字符串以外的值,它將像$1一樣擴展。

  3. 「爲什麼我不能這樣做? DIR="$1" || '.'

    因爲這是bash,而不是perl或ruby或其他語言。 (請原諒我的猥褻行爲。)

    在bash中,||分隔了整個命令(從技術上說,它將管道分開)。它不分開表達式。

    因此DIR="$1" || '.'的意思是「執行DIR="$1",如果退出代碼爲非零退出代碼,則執行'.'」。

2

如何:

DIR=. 
if [ $# -gt 0 ]; then 
    DIR=$1 
fi 

$#是給腳本的參數的數量和-gt意味着「大於」,所以你基本上設置DIR爲默認值,如果用戶指定一個參數,然後你設置DIR

+1

這並不可怕,儘管四行絕對看起來對我來說太冗長了。我寧願使用連字符變量擴展,因爲我已經知道它在這一點上意味着什麼。 – 2013-04-18 05:05:40

相關問題