2011-07-28 19 views
11

¿Bash tiene algo así como || =?Bash or-equals || = like Ruby

Es decir, ¿existe una mejor manera de hacer lo siguiente:

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

Lo digo porque me sale este error:

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

lo tanto, mi plan es hacer:

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

Mi verdadera pregunta es: "¿Hay una manera mejor de hacer lo siguiente?"

# ~/.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

diferente (o mejor) pero más corto: '[-z $ PWD] && PWD = \' pwd \ '' – pje

Respuesta

17

Bash permite valores por defecto:

a=${b-`pwd`} 

Si $b no está definido, entonces pwd se utiliza en lugar de la asignación de $a.

+0

Más a menudo, veo otra forma: '$ {PWD: - \' pwd \ '}' Me pregunto si son equivalentes – GregT

+2

@GregT si 'b' está desarmado, se comportarán igual. Sin embargo, si 'b' se establece en una cadena vacía,' $ {b- \ 'pwd \'} 'dará como resultado una cadena vacía, pero' $ {b: - \ 'pwd \'} 'dará como resultado el directorio de trabajo. –

2

Puede configurar su pronta para ser el directorio de trabajo con esto:

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

Otra solución (que se asemeja más a Ruby o es igual en mi opinión) sería:

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

Si bien me gusta el estilo, si MyVar se establece en una cadena de longitud cero, no se establecerá en 'valor' en este ejemplo, mientras que usar bash "valores predeterminados" a la @Manny D, arriba, funcionaría correctamente, como en: 'MyVar = $ {MyVar-'value '} – malcook