如果bash中只有变量的if语句的结果是什么?

时间:2019-02-14 22:20:26

标签: linux bash shell

我正在学习bash --login,发现/etc/profile中的命令首先执行。在该文件中:

# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).

if [ "`id -u`" -eq 0 ]; then
  PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
else
  PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games"
fi
export PATH

if [ "$PS1" ]; then
  if [ "$BASH" ] && [ "$BASH" != "/bin/sh" ]; then
    # The file bash.bashrc already sets the default PS1.
    # PS1='\h:\w\$ '
    if [ -f /etc/bash.bashrc ]; then
      . /etc/bash.bashrc
    fi
  else
    if [ "`id -u`" -eq 0 ]; then
      PS1='# '
    else
      PS1='$ '
    fi
  fi
fi

if [ -d /etc/profile.d ]; then
  for i in /etc/profile.d/*.sh; do
    if [ -r $i ]; then
      . $i
    fi
  done
  unset i
fi

现在,我当然承认对bash中的控制流有有限的了解,但是根据我的了解,在大多数情况下,我在if语句中看到的是某种条件语句,是否检查[-a FILENAME]如果文件存在或字符串之间的比较,通常它的计算结果为某种值。

在文件中,两个if语句使我感到困惑:

if [ "$PS1" ];if[ "$BASH" ]

我知道PS1是主要提示的变量,但这就是if语句中的全部内容。它不是在使用-a检查存在性或将其与其他事物进行比较。我的有根据的猜测是,简单地放置一个变量,如果存在则将评估为true。

我的问题是 if语句求值的原因是什么?为什么?

2 个答案:

答案 0 :(得分:3)

如果[ "$var" ]的长度不为零,则

$var返回true。如果var未设置或为空,则返回false。

这很有用:

  • [ "$PS1" ]仅对 interactive 外壳有效。

  • [ "$BASH" ]仅在shell为bash(而不是dash,ksh或zsh等)时才为true。

示例

只有以下一项为真:

$ unset x; [ "$x" ] && echo yes
$ x=""; [ "$x" ] && echo yes
$ x="a"; [ "$x" ] && echo yes
yes

文档

{b}的交互式帮助系统在man bashGlenn Jackman中都对此进行了记录。有关[命令的信息,请输入:

$ help [
[: [ arg... ]
    Evaluate conditional expression.

    This is a synonym for the "test" builtin, but the last argument must
    be a literal `]', to match the opening `['.

以上内容是指test。运行help test以获得更多详细信息:

$ help test | less

滚动浏览该文档,然后发现:

  STRING      True if string is not empty.

答案 1 :(得分:1)

代码if [ "$PS1" ];if [ "$BASH" ]测试字符串"$PS1""$BASH"是否为空,如果为空,则执行某些操作;并且由于if [ "$BASH" ]测试具有匹配的else,因此如果$BASH为空,它也会执行某些操作。

该语句的长格式可能更清楚,但以下各项均等效:

test -n "$PS1"   # returns an exit code of `0` if `$PS1` is not empty, or `1` if not.

更短:

test "$PS1" 

更短:

[ -n "$PS1" ] 

最短:

[ "$PS1" ]