得之我幸 失之我命

when someone abandons you,it is him that gets loss because he lost someone who truly loves him but you just lost one who doesn’t love you.

PS1- 引发的查证

起因

实不相瞒,茫茫 bash 世界,随着 shell 脚本看的越来越多,发现懂得东西也是越来越少,这不,上周在看 git bash 下 git_prompt.sh 的时候,又发现一个神奇的 ${PS1-}

完整的脚本片段如下:

1
if [ "${PS1-}" ]; then

这个 ${PS1-} 的 - 是个啥情况,引用变量不是直接 $PS1 就好了吗?

${parameter-word} 参数扩展

原来这货不仅仅是对的,而且比直接 $PS1 还来的更加强大,它的大名叫 ${parameter-word} 参数扩展,关于它更多的 “家族” 信息可以点这里查询

用一段实际操作来展示一下这个参数扩展的含义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# test 变量并不存在
$ echo ${test-}
# 输出空
$ echo ${test-1}
1

# test 变量设置为 2
$ test=2
$ echo ${test-1}
2

# test 变量设置为空
$ test=
$ echo ${test-1}
# 输出空

总结一下:

${parameter-word} 会验证 parameter 是不是存在,如果不存在,就将 word 设置成 parameter 变量的值,那如果我想在它是空值的时候把 word 赋值它呢,那就用 ${parameter:-word}

其实在直接使用 echo 的时候并不能看出参数扩展的作用,但当你打开 set -u 的时候,就会发现这个形式的作用了

1
2
3
4
5
$ set -u  # 当试图使用一个未声明的变量时将报错
$ if [ "$test" ]; then echo yes; else echo no; fi
-bash: test: unbound variable # 得到了一个错误
$ if [ "${test-}" ]; then echo yes; else echo no; fi
no # 避免了报错

be slow to promise and quick to perform.