我遇到过一个使用的脚本
VAR1=${1:-8}
VAR2=${2:-4}
我可以看到从其他一些问题并使用一些代码
VAR1=${VAR2:-8}
将创造VAR1
出任何价值VAR2
(如果存在的话)。如果VAR2
未设置,则VAR1
默认为值 8,并将VAR2
保持未设置状态。也就是说,执行此命令后,echo VAR2
不会返回任何内容。
那么,我的问题是第一行代码的作用。由于变量名不能以数字开头,VAR1
因此显然没有被设置为 1 或任何名为 1 的变量。这肯定是有原因的,而且这不仅仅是一点毫无意义的混淆?
答案1
${1:-8}
和中使用的变量${2:-4}
是位置参数$1
和$2
。它们保存在命令行上传递给脚本(或 shell 函数)的值。如果它们未设置或为空,您提到的变量替换将分别使用默认值 8 和 4。
这可能用在 shell 脚本或需要(至少)两个命令行参数的 shell 函数中,如果没有提供默认值,您希望为其提供默认值。
脚本或 shell 函数可以采用任意数量的参数,并且可以通过在脚本或函数中使用$1
, , ..., 来引用这些参数。$2
要获取 9 以上的位置参数的值,需要编写等${10}
。${11}
在这种情况下,另一个有用的变量替换是,如果未设置,${parameter:?word}
它将显示word
为错误(并退出脚本) :parameter
$ cat script.sh
#!/bin/bash
var1="${1:?Must provide command line argument}"
printf 'I got "%s"\n' "$var1"
$ ./script.sh
script.sh: line 3: 1: Must provide command line argument
$ ./script.sh "Hello world."
I got "Hello world."
答案2
它指的是位置参数$1 ... $n
。
${1:-default}
意思是“如果参数 1 未设置或为空,则使用default
”。
注意:不要${1:-2}
与混淆${1: -2}
。对于 bash,后者被替换为 的最后两个字符$1
。
例子:
$ set --
$ echo "${1:-2}"
2
$ set 345 678
$ echo "${1:-2}"
345
$ echo "${1: -2}"
45