编写脚本时,我通常使用以下语法编写 if,因为我更容易理解接下来发生的事情是不正确的。
if [ ! "$1" = "$2" ]; then
Run Code Online (Sandbox Code Playgroud)
还有人说下面的方法更好
if [ "$1" != "$2" ]; then
Run Code Online (Sandbox Code Playgroud)
问题是当我问为什么以及是否有任何差异时,似乎没有人有任何答案。
那么,这两种语法之间有什么区别吗?其中一个比另一个更安全吗?或者这只是偏好/习惯问题?
我看到下面循环的行为与带有while [ 1 ]. 为什么呢?
while [ 0 ]; do
echo "hello"
done
Run Code Online (Sandbox Code Playgroud) 假设我们在 bash 脚本中有 2 个整数:
value1=5
value2=3
Run Code Online (Sandbox Code Playgroud)
那么为什么我们需要在测试的情况下使用双引号呢?例如:
if [[ "$value1" -eq "$value2" ]]
Run Code Online (Sandbox Code Playgroud)
为什么不使用以下内容?
if [[ $value1 -eq $value2 ]]
Run Code Online (Sandbox Code Playgroud)
对我来说,双引号没有任何意义。
对于“GNU bash,版本 4.2”之前的 Bash 版本,是否有任何等效-v的test命令选项替代方案?例如:
shopt -os nounset
test -v foobar && echo foo || echo bar
# Output: bar
foobar=
test -v foobar && echo foo || echo bar
# Output: foo
Run Code Online (Sandbox Code Playgroud) 我的ifbash 脚本中有以下块:
if [ ${PACKAGENAME} -eq kakadu-v6_4-00902C ]; then
echo "successfully entered if block!!"
fi
Run Code Online (Sandbox Code Playgroud)
该脚本执行不进入我的if块,即使$PACKAGENAME是相同kakadu-v6_4-00902C。我究竟做错了什么?
用于打印所有文件夹的 Bash 代码:
for f in ~/*;
do
if [ $f == '/home/sk/.' -o $f == '/home/sk/..' ]; then
true
else
echo "$f"
fi
done
Run Code Online (Sandbox Code Playgroud)
它适用于 bash。当我在 z shell 上运行代码时,它抛出了错误:
= not found
Run Code Online (Sandbox Code Playgroud)
然后我转换[为[[, ]into]]以避免在 z shell 中出现此错误并在 z shell 上运行它。它抛出了下一个错误:
condition expected: $f
Run Code Online (Sandbox Code Playgroud)
使用[[and ]],bash 也会抛出错误:
syntax error in conditional expression
syntax error near `-o'
Run Code Online (Sandbox Code Playgroud)
是否有一个 POSIX 标准可以在 shell 中进行字符串比较,它可以跨 shell 工作?
假设我想比较gcc版本以查看系统是否安装了最低版本。
为了检查gcc版本,我执行了以下操作
gcc --version | head -n1 | cut -d" " -f4
Run Code Online (Sandbox Code Playgroud)
输出是
4.8.5
Run Code Online (Sandbox Code Playgroud)
所以,我写了一个简单的if语句来检查这个版本与其他一些值
if [ "$(gcc --version | head -n1 | cut -d" " -f4)" -lt 5.0.0 ]; then
echo "Less than 5.0.0"
else
echo "Greater than 5.0.0"
fi
Run Code Online (Sandbox Code Playgroud)
但它抛出一个错误:
[: integer expression expected: 4.8.5
Run Code Online (Sandbox Code Playgroud)
我理解我的错误,我使用字符串进行比较并且-lt需要整数。那么,有没有其他方法可以比较版本?
我在 Linux 上使用 bash。我从以下 if 语句中获得了成功,但这不应该返回失败代码吗?
if [[ ? = [???] ]] ; then echo yes ; fi
Run Code Online (Sandbox Code Playgroud)
正方形不等于任何字符,所以我不明白为什么我会得到成功代码。
在我的案例中保留双括号对我来说很重要。
在这种情况下有没有其他方法可以做一个范围,或者有什么其他建议?
当脚本在一年的开始两天运行时,我使用下面的脚本将两天后移,并检查每个月的第一天和第二天,然后将后移两天。
if [$month="01"] && [$day="01"]; then
date="$last_month/$yes_day/$last_year"
fulldate="$last_month/$yes_day/$last_year"
else
if [$month="01"] && [$day="02"]; then
date="$last_month/$yes_day/$last_year"
fulldate="$last_month/$yes_day/$last_year"
else
if [ $day = "01" ]; then
date="$last_month/$yes_day/$year"
fulldate="$year$last_month$yes_day"
else
if [ $day = "02" ]; then
date="$last_month/$yes_day/$year"
fulldate="$year$last_month$yes_day"
else
date="$month/$yes_day/$year"
fulldate="$year$month$yes_day"
fi
fi
fi
fi
Run Code Online (Sandbox Code Playgroud)
但我的坏消息是收到以下错误消息
Etime_script.sh: line 19: [06=01]: command not found
Etime_script.sh: line 24: [06=01]: command not found
Run Code Online (Sandbox Code Playgroud) test ×10
bash ×8
shell ×5
shell-script ×3
command ×1
locale ×1
numeric-data ×1
quoting ×1
variable ×1
version ×1
whitespace ×1
zsh ×1