Bash:如何将这 2 个 if 语句压缩为一个
Bash : how to squeeze these 2 if statements into one
我是 Bash 和脚本编写的新手,我想找出一种方法将这两个语句组合成 1 。这个脚本的作用是检查两个文件 D1 和 D2 是否是同一个文件,如果不是则检查它们的内容是否相同。
if [ ! $D1 -ef $D2 ]
then
echo not the same file
if cmp -s $D1 $D2
then
echo same info
else
echo not same info
fi
else
echo same file
fi
除此之外,我也很困惑什么时候使用[]什么时候跳过它们,手册上说什么时候有条件使用[],但那是什么意思?
谢谢。
if
语句的语法是(来自 2.10 Shell Grammar):
if_clause : If compound_list Then compound_list else_part Fi
| If compound_list Then compound_list Fi
其中 compound_list
最终归结为一个命令。
! $D1 -ef $D2
不是命令。
[
是一个命令(也称为 test
)。请参阅 type [
或 type test
以及 which [
和 which test
.
的输出
因此 [ ! $D1 -ef $D2 ]
是 if
语句中使用的有效命令。
compound_list
的 return 值是 if
测试的值。
因此,当您使用 cmp
(或任何其他命令)之类的东西时,没有理由使用 [
,事实上,使用 [
是不正确的。
因为 compound_list
可以是多个命令来组合 [ ! $D1 -ef $D2 ]
和 cmp -s $D1 $D2
,只需照常使用 &&
。 (也需要 cmp
调用上的 !
来反转它以从两者获得 "not same" 测试。)
if [ ! "$D1" -ef "$D2" ] && ! cmp -s "$D1" "$D2"; then
echo 'Not same file or same contents'
fi
我是 Bash 和脚本编写的新手,我想找出一种方法将这两个语句组合成 1 。这个脚本的作用是检查两个文件 D1 和 D2 是否是同一个文件,如果不是则检查它们的内容是否相同。
if [ ! $D1 -ef $D2 ]
then
echo not the same file
if cmp -s $D1 $D2
then
echo same info
else
echo not same info
fi
else
echo same file
fi
除此之外,我也很困惑什么时候使用[]什么时候跳过它们,手册上说什么时候有条件使用[],但那是什么意思?
谢谢。
if
语句的语法是(来自 2.10 Shell Grammar):
if_clause : If compound_list Then compound_list else_part Fi
| If compound_list Then compound_list Fi
其中 compound_list
最终归结为一个命令。
! $D1 -ef $D2
不是命令。
[
是一个命令(也称为 test
)。请参阅 type [
或 type test
以及 which [
和 which test
.
因此 [ ! $D1 -ef $D2 ]
是 if
语句中使用的有效命令。
compound_list
的 return 值是 if
测试的值。
因此,当您使用 cmp
(或任何其他命令)之类的东西时,没有理由使用 [
,事实上,使用 [
是不正确的。
因为 compound_list
可以是多个命令来组合 [ ! $D1 -ef $D2 ]
和 cmp -s $D1 $D2
,只需照常使用 &&
。 (也需要 cmp
调用上的 !
来反转它以从两者获得 "not same" 测试。)
if [ ! "$D1" -ef "$D2" ] && ! cmp -s "$D1" "$D2"; then
echo 'Not same file or same contents'
fi