2011-07-28 26 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