$ {var:-word}和$ {var-word}之间有什么区别?

pet*_*ohn 1 parameters bash

我在bash脚本中找到了以下命令:

git blame $NOT_WHITESPACE --line-porcelain "${2-@}" -- "$file"
Run Code Online (Sandbox Code Playgroud)

${2-@}是什么意思?尝试,它返回第二个参数,如果它不存在则返回"@".根据文档,${2:-@}应该做同样的事情.我试了一下,确实也是这样.有什么不同?它在哪里记录?手册页似乎没有说明这种表示法.

fed*_*qui 8

来自Bash黑客wiki - 参数扩展:

$ {参数:-word}

$ {参数WORD}

如果参数PARAMETER未设置(从未定义)或null(空),则此参数将扩展为WORD,否则它将扩展为PARAMETER的值,就好像它只是$ {PARAMETER}一样.如果省略:(冒号),如第二种形式所示,则默认值仅在参数未设置时使用,而不是在为空时使用.

echo "Your home directory is: ${HOME:-/home/$USER}."
echo "${HOME:-/home/$USER} will be used to store your personal data."
Run Code Online (Sandbox Code Playgroud)

如果HOME未设置或为空,则每次要打印有用的内容时,都需要将该参数语法放入.

#!/bin/bash

read -p "Enter your gender (just press ENTER to not tell us): " GENDER
echo "Your gender is ${GENDER:-a secret}."
Run Code Online (Sandbox Code Playgroud)

它将打印出"你的性别是一个秘密".当你没有输入性别.请注意,默认值用于扩展时间,不会分配给参数.