我对这些运算符在 bash 中使用时有何不同(括号、双括号、括号和双括号)感到有些困惑。
[[ , [ , ( , ((
Run Code Online (Sandbox Code Playgroud)
我见过人们在这样的 if 语句中使用它们:
if [[condition]]
if [condition]
if ((condition))
if (condition)
Run Code Online (Sandbox Code Playgroud) 我有两个进程foo和bar,用管道连接:
$ foo | bar
Run Code Online (Sandbox Code Playgroud)
bar总是退出 0;我对foo. 有什么办法可以得到吗?
我有一个计划每天运行的 cron 作业,除了更改计划之外,还有没有其他方法可以立即对命令进行测试运行以查看它是否按预期工作?
编辑:(从评论中)我知道在 shell(我的 shell)中输入命令时该命令可以正常工作,但是我想知道当 cron 运行它时它是否可以正常工作,它可能会受到 ENV 或特定于 shell 的东西的影响(~扩展) 或所有权和许可的东西或...
过去的旧建议是对任何涉及 a 的表达式加双引号$VARIABLE,至少在希望 shell 将其解释为单个项目的情况下,否则,内容中的任何空格$VARIABLE都会脱离 shell。
但是,我知道在较新版本的 shell 中,不再总是需要双引号(至少出于上述目的)。例如,在bash:
% FOO='bar baz'
% [ $FOO = 'bar baz' ] && echo OK
bash: [: too many arguments
% [[ $FOO = 'bar baz' ]] && echo OK
OK
% touch 'bar baz'
% ls $FOO
ls: cannot access bar: No such file or directory
ls: cannot access baz: No such file or directory
Run Code Online (Sandbox Code Playgroud)
在zsh,而另一方面,同样的三个命令成功。因此,基于此实验,似乎在 中bash可以省略 内部的双引号[[ ... ]],但不能省略内部 …
据我所知,方括号通常用于将表达式括在 if else 语句中。
但我发现方括号没有“if”,如下所示:
[ -r /etc/profile.d/java.sh ] && . /etc/profile.d/java.sh
Run Code Online (Sandbox Code Playgroud)
在下面的脚本中。
#!/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 …Run Code Online (Sandbox Code Playgroud) 为了比较里面的字符串,if我们需要使用双方括号。有些书说比较可以通过=. 但它也适用于==。
#!/bin/bash
a="hello"
b="world"
if [[ $a == $b ]];then
echo "equal"
fi
Run Code Online (Sandbox Code Playgroud)
比较=和==比较有区别吗?
我知道我可以
$ [ -w /home/durrantm ] && echo "writable"
writable
Run Code Online (Sandbox Code Playgroud)
或者
$ test -w /home/durrantm && echo "writable"
writable
Run Code Online (Sandbox Code Playgroud)
或者
$ [[ -w /home/durrantm ]] && echo "writable"
writable
Run Code Online (Sandbox Code Playgroud)
我喜欢使用第三种语法。它们在所有方面以及所有负面和边缘情况下都等效吗?可移植性是否有任何差异,例如 Ubuntu 上的 bash 和 OS X 上的 bash 或较旧/较新的 bash 版本,例如 4.0 之前/之后,它们是否都以相同的方式扩展表达式?
这两者有什么区别吗。
[[ $a == z* ]]
Run Code Online (Sandbox Code Playgroud)
和
[ $a == z* ]
Run Code Online (Sandbox Code Playgroud)
我可以举一个例子,他们会有不同的输出吗?
此外, 的工作方式[[ ]]与[ ]?
在 Bash 中,可以使用条件表达式比较两个整数
ARG1 OP ARG2
OP是一个
-eq,-ne,-lt,-le,-gt,或-ge。如果arg1 分别等于、不等于、小于、小于或等于、大于或大于或等于arg2,则这些算术二元运算符返回 true 。Arg1和arg2可以是正整数或负整数。
或算术表达式:
<= >= < >比较
== !=平等与不平等
为什么我们有两种不同的方法来比较两个整数?什么时候用哪个?
例如,[[ 3 -lt 2 ]]使用条件表达式,并(( 3 < 2 ))使用算术表达式。当比较为真时两者都返回 0
比较两个整数时,这两种方法可以互换使用吗?如果是,为什么 Bash 有两种方法而不是一种方法?
我想从 linux 命令行检查给定的明文密码是否与 /etc/shadow 上的加密密码相同
(我需要这个来验证网络用户的身份。我正在运行一个嵌入式 linux。)
我可以访问 /etc/shadow 文件本身。
bash ×6
shell ×6
test ×4
shell-script ×3
arithmetic ×1
command-line ×1
cron ×1
debugging ×1
embedded ×1
exit ×1
history ×1
linux ×1
password ×1
pipe ×1
portability ×1
posix ×1
quoting ×1
wildcards ×1
zsh ×1