据我所知,方括号通常用于将表达式括在 if else 语句中。
但我发现使用方括号时没有使用“if”,如下所示:
[ -r /etc/profile.d/java.sh ] && . /etc/profile.d/java.sh
在下面的脚本中。
#!/bin/bash### BEGIN INIT INFO
# Provides: jbossas7
# Required-Start: $local_fs $remote_fs $network $syslog
# Required-Stop: $local_fs $remote_fs $network $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start/Stop JBoss AS 7
### END INIT INFO
# chkconfig: 35 92 1
## Include some script files in order to set and export environmental variables
## as well as add the appropriate executables to $PATH.
[ -r /etc/profile.d/java.sh ] && . /etc/profile.d/java.sh
[ -r /etc/profile.d/jboss.sh ] && . /etc/profile.d/jboss.sh
JBOSS_HOME=/sw/AS7
AS7_OPTS="$AS7_OPTS -Dorg.apache.tomcat.util.http.ServerCookie.ALLOW_HTTP_SEPARATORS_IN_V0=true" ## See AS7-1625
AS7_OPTS="$AS7_OPTS -Djboss.bind.address.management=0.0.0.0"
AS7_OPTS="$AS7_OPTS -Djboss.bind.address=0.0.0.0"
case "$1" in
start)
echo "Starting JBoss AS 7..."
#sudo -u jboss sh ${JBOSS_HOME}/bin/standalone.sh $AS7_OPTS ## If running as user "jboss"
#start-stop-daemon --start --quiet --background --chuid jboss --exec ${JBOSS_HOME}/bin/standalone.sh $AS7_OPTS ## Ubuntu
${JBOSS_HOME}/bin/standalone.sh $AS7_OPTS &
;;
stop)
echo "Stopping JBoss AS 7..."
#sudo -u jboss sh ${JBOSS_HOME}/bin/jboss-admin.sh --connect command=:shutdown ## If running as user "jboss"
#start-stop-daemon --start --quiet --background --chuid jboss --exec ${JBOSS_HOME}/bin/jboss-admin.sh -- --connect command=:shutdown ## Ubuntu
${JBOSS_HOME}/bin/jboss-cli.sh --connect command=:shutdown
;;
*)
echo "Usage: /etc/init.d/jbossas7 {start|stop}"; exit 1;
;;
esac
exit 0
如果没有“if”,方括号有什么作用?我的意思是,确切地说,它们在这种情况下使用时意味着什么?
这不是重复的那其中OP使用了“if”,我对此没有问题。在这个问题中,括号的使用方式与直觉相反。这个问题和这个问题可能有相同的答案,但它们是两个不同的问题。
答案1
方括号是执行条件测试的简写符号。信不信由你,括号[
以及是 Unix 中的实际命令。[[
思考:
$ [ -f /etc/rc.local ] && echo "real file"
real file
-and-
$ test -f /etc/rc.local && echo "real file"
real file
在 Bash 中,它[
是一个内置命令,也是一个可执行文件。[[
只是 Bash 的一个关键字。
例子
您可以使用以下方法确认这一点type
:
$ type -a [
[ is a shell builtin
[ is /usr/bin/[
$ type -a [[
[[ is a shell keyword
您可以在此处查看物理可执行文件:
$ ls -l /usr/bin/[
-rwxr-xr-x 1 root root 37000 Nov 3 2010 /usr/bin/[
内置函数与关键字
如果您查看 Bash 手册页,man bash
您会发现 2 的以下定义:
关键词- 保留字是对 shell 有特殊含义的字。以下单词在未加引号时被识别为保留字,并且是简单命令的第一个字(请参见下面的 SHELL GRAMMAR)或 case 或 for 命令的第三个字:
! case do done elif else esac fi for function if in select then until while { } time [[ ]]
内置函数- 如果命令名称不包含斜杠,则 shell 会尝试找到它。如果存在同名的 shell 函数,则按照上述函数中所述调用该函数。如果名称与函数不匹配,则 shell 会在 shell 内置函数列表中搜索该函数。如果找到匹配项,则调用该内置函数。
如果该名称既不是 shell 函数也不是内置函数,并且不包含斜杠,则 bash 会在 PATH 的每个元素中搜索包含该名称的可执行文件的目录。 Bash 使用哈希表来记住可执行文件的完整路径名(请参阅下面的 SHELL BUILTIN COMMANDS 下的哈希)。仅当在哈希表中未找到该命令时,才会对 PATH 中的目录执行完整搜索。如果搜索不成功,shell 将搜索名为 command_not_found_handle 的已定义 shell 函数。如果该函数存在,则使用原始命令和原始命令的参数作为其参数来调用该函数,并且该函数的退出状态将成为 shell 的退出状态。如果未定义该函数,shell 将打印一条错误消息并返回退出状态 127。
手册页
如果您查看 Bash 手册页,您会找到有关它的详细信息。
test expr
[ expr ]
Return a status of 0 or 1 depending on the evaluation of the
conditional expression expr. Each operator and operand must be
a separate argument. Expressions are composed of the primaries
described above under CONDITIONAL EXPRESSIONS. test does not
accept any options, nor does it accept and ignore an argument of
-- as signifying the end of options.
最后来自手册页:
test and [ evaluate conditional expressions using a set of rules
based on the number of arguments.
编辑#1
OP 的后续问题。
好吧,那为什么还需要“如果”呢?我的意思是,如果“[”就足够了,为什么“如果”甚至存在。
这if
是条件句的一部分。命令test
或[ ... ]
命令只是评估条件,并返回 0 或 1。然后 if 语句对 0 或 1 进行操作。当您使用它们时,两者一起工作。
例子
if [ ... ]; then
... do this ...
else
... do that ...
fi
答案2
哦哦,我最喜欢的话题之一!!
方括号是“test”命令的同义词。如果您阅读测试手册页,您会发现可以通过以下方式调用测试命令:
test -r /etc/profile.d/java.sh
或者
[ -r /etc/profile.d/java.sh ]
括号之间以及括号内外的东西都是需要的。
本例中的“test”命令检查文件 /etc/profile.d/java.sh 是否对当前用户可读。当然,隐含的是检查它是否存在。 :-)
这&&
是 bash 语法的快捷方式,表示“如果左侧的命令成功,则执行右侧的命令”。因此,这个复合命令是“if-then”的简写,如下所示:
if test -r /etc/profile.d/java.sh
then
/etc/profile.d/java.sh
fi
现在,您还会发现 bash 手册页中解释了双方括号。这些是扩展测试功能的 bash 内部版本。请注意,这些并不完全相同。有些事情可以用“test”命令及其“[”同义词做而不能做。