2011-07-28 27 views
11

Bash是否有類似於|| =的內容?Bash or-equals || = like Ruby

也就是說,有沒有更好的方式來做到以下幾點:

if [ -z $PWD ]; then PWD=`pwd`; fi 

我這麼問是因爲我得到這個錯誤:

$ echo ${`pwd`/$HOME/'~'} 
-bash: ${`pwd`/$HOME/'~'}: bad substitution 

所以,我的計劃是要做到:

if [ -z $PWD ]; then PWD=`pwd`; fi 
echo ${PWD/$HOME/'~'} 

我真正的問題是:「有沒有更好的方法來做到以下幾點?」

# ~/.bash_profile 

# Set prompt to RVM gemset, abbr. of current directory & (git branch). 
PROMPT_COMMAND='CUR_DIR=`pwd|sed -e "s!$HOME!~!"|sed -E "s!([^/])[^/]+/!\1/!g"`' 
PS1='$(~/.rvm/bin/rvm-prompt g) [$CUR_DIR$(__git_ps1)]\$ ' 
+0

不不同的(或更好的)但更短的:'[-z $ PWD] && PWD = \'pwd \'' – pje

回答

17

擊允許的默認值:

a=${b-`pwd`} 

$b如果未定義,則pwd來代替在分配$a

+0

我經常看到另一種形式:'$ {PWD: - \''pwd \''''是相等的 – GregT

+2

@GregT如果'b'未設置,它們將表現相同。然而,如果'b'被設置爲一個空字符串,那麼'$ {b- \''pwd \'}'將產生一個空字符串,但是'$ {b: - \''pwd \'}'將導致工作目錄。 –

2

您可以設置提示與此工作目錄:

PS1='\w ' # Using \W will provide just basename 
2

另一種解決方案(這是更類似於Ruby的或,等於在我看來)是:

[ ! -z $MyVar ] || MyVar='value' 
+0

儘管我喜歡這種風格,但如果MyVar設置爲零長度的字符串,在本例中它不會被設置爲'value',而使用bash「默認值」la @Manny D,可以正確地工作,因爲in:'MyVar = $ {MyVar-'value'} – malcook