这个bash是什么意思:USER = $ {1:-`id -un`}

时间:2016-04-08 18:28:45

标签: bash

我在项目中的一个旧脚本中无法理解这一行:

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

4 个答案:

答案 0 :(得分:5)

它是bash参数扩展模式。

给定的陈述表明:

  • 如果$1(第一个位置参数(参数))的值未设置或为null,则命令id -un的输出将设置为变量USER < / p>

  • 如果参数$1已设置且不为null,则$1的展开式将设置为参数USER

此外,变量USER应在登录时设置为会话范围,除非您有充分的理由不应直接修改它。您可以在脚本中使用不同的变量名作为解决方案。

检查Parameter Expansion的{​​{1}}部分以获取更多信息。

答案 1 :(得分:1)

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

格式:-仅在左侧的内容未设置时才使用右侧的内容。关于此语法here可以了解更多信息。

因此,您提供的代码实际上是默认为user,但如果提供了$USER变量,则覆盖$1的值。

答案 2 :(得分:0)

以这种方式解析:

  1. ${}告诉您这是parameter expansion
  2. 如果左手未设置,则:-使用:-右手的default value
  3. RH周围的反引号会运行该命令
  4. 示例:

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

    还有其他形式,包括:

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

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

    2. ${parameter:+word}仅在word设置时替换parameter

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

    3. ${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=....

平等的右边有几个级别。

  • A&#34;参数扩展&#34;,${ }
  • 正在展开的参数是$1。这就是${1 ... }
  • 的原因
  • 正在测试$1的值NUL或未设置${1:- }
  • 如果值为$ 1(nul除外),则替换该值。
  • 如果$1NUL或未设置,请替换-的必要值。
  • -}之间的值是&#34;命令替换&#34;。
  • &#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