我在项目中的一个旧脚本中无法理解这一行:
USER=${1:-`id -un`}
答案 0 :(得分:5)
它是bash
参数扩展模式。
给定的陈述表明:
如果$1
(第一个位置参数(参数))的值未设置或为null,则命令id -un
的输出将设置为变量USER
< / p>
如果参数$1
已设置且不为null,则$1
的展开式将设置为参数USER
。
此外,变量USER
应在登录时设置为会话范围,除非您有充分的理由不应直接修改它。您可以在脚本中使用不同的变量名作为解决方案。
检查Parameter Expansion
的{{1}}部分以获取更多信息。
答案 1 :(得分:1)
查看id
(man id
)的手册页,命令id -un
将返回用户的实际名称。
格式:-
仅在左侧的内容未设置时才使用右侧的内容。关于此语法here可以了解更多信息。
因此,您提供的代码实际上是默认为user,但如果提供了$USER
变量,则覆盖$1
的值。
答案 2 :(得分:0)
以这种方式解析:
${}
告诉您这是parameter expansion :-
使用:-
右手的default value 示例:
$ sv="set v"
$ echo ${sv:-`whoami`}
set v
$ echo ${not_set:-`whoami`}
dawg
还有其他形式,包括:
${parameter:?word}
会显示错误,
$ echo ${not_set:?'is not set to anything'}
-bash: not_set: is not set to anything
${parameter:+word}
仅在word
设置时替换parameter
$ echo ${sv:+'substitute for sv'}
substitute for sv
${parameter:=word}
如果parameter
未设置,则word
分配parameter
的值
$ echo ${not_set:='now it IS set'}
now it IS set
$ echo "$not_set"
now it IS set
答案 3 :(得分:0)
该行设置名为USER
的变量的值:
USER=....
平等的右边有几个级别。
${ }
。$1
。这就是${1 ... }
。$1
的值NUL
或未设置${1:- }
。$1
为NUL
或未设置,请替换-
的必要值。-
和}
之间的值是&#34;命令替换&#34;。id -un
。您可以通过man id
了解它的作用。id -un
打印一个名称。如果省略用户,则为当前用户。 $(id -un)
可以执行相同的命令。
这会改变这一行:
$ USER=${1:-$(id -un)}
将USER设置为位置参数1
给出的名称或执行该行的当前用户的名称。
要尝试它,您可以创建一个函数:
$ tf(){ USER=${1:-$(id -un)}; echo "$USER"; }
如果给出了值,则打印该值:
$ tf bind
bind
如果未给出用户名,则打印正在执行的用户名:
$ tf
bize