2016-04-08 64 views
4

我不明白这行老的脚本在我的项目之一:

USER=${1:-`id -un`} 

回答

4

这是一个bash参数扩展模式。

给定语句表示:

  • 如果$1(第一位置参数(自变量))的值是设置或者为空,则命令id -un的输出将被设置为变量USER

  • 如果参数$1设置为非空,则$1的扩展将设置为参数USER

而且变量USER应宽在登录时设置会话,除非你有你不应该直接修改它一个很好的理由。然后,您可以在脚本中使用不同的变量名称作为解决方案。

检查man bashParameter Expansion部分以获得更多想法。

0

解析这样说:

  1. ${}告诉你,这是一个parameter expansion
  2. :-是使用:-右手的default value如果左手是没有设置
  3. 的反引号在RH运行那个命令

例如:

$ sv="set v" 
$ echo ${sv:-`whoami`} 
set v 
$ echo ${not_set:-`whoami`} 
dawg 

还有其他形式的,包括:

  1. ${parameter:?word}显示如果参数是未设置错误,的word仅当

    $ echo ${not_set:?'is not set to anything'}
    -bash: not_set: is not set to anything

  2. ${parameter:+word}替代值parameter设置为

    $ echo ${sv:+'substitute for sv'}
    substitute for sv

  3. ${parameter:=word}分配parameterword如果parameter值未设置

    $ echo ${not_set:='now it IS set'}
    now it IS set
    $ echo "$not_set"
    now it IS set

1

查看idman id)的手册页,命令id -un将返回用户的实际名称。

格式:-只有在未设置左侧的内容时才会使用右侧的内容。有关此语法的更多信息,请参阅here

因此,您提供的代码实质上是默认给用户,但如果提供的话,则将$USER变量替换为值$1

0

即线被设置称为USER变量的值:

USER=.... 

相等的右侧有几个等级。

  • “参数扩展”,${ }
  • 正在展开的参数是$1。这就是为什么它是${1 ... }
  • 如果它是NUL或未设置,${1:- }正在测试值$1
  • 如果有$ 1(除nul以外)的值,则替换该值。
  • 如果$1NUL或取消设置,则将该值替换为-的纵坐标。
  • -}之间的值是“命令替换”。
  • “命令执行”执行命令并替换其输出。
  • 该命令是id -un。你可以理解它与man id有什么关系。
  • 命令id -un打印一个名称。当前用户(如果用户被省略)。

同样的命令可以由$(id -un)执行。

这将改变行这样的:

$ USER=${1:-$(id -un)} 

将设置用户给定的位置参数1或执行就行了当前用户的名称的名称。

要尝试它,你可以做一个函数:

$ tf(){ USER=${1:-$(id -un)}; echo "$USER"; } 

如果给出值,该值将被打印回:

$ tf bind 
bind 

如果用户名没有给出,执行用户名称被打印:

$ tf 
bize