我正在学习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语句求值的原因是什么?为什么?
答案 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 bash
和Glenn 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" ]