我有一个小的shell脚本,似乎无法弄清楚如何创建一个简单的条件语句。
big_width=$(($width > 1700))
big_height=$(($height > 1700))
if [ $extension != "jpg" || $big_width || $big_height ]; then
给出错误
[: missing ]
0: not found
还有IDK,如果这会给我我想要的东西。如果$extension != "jpg
或其中一个宽度/高度变量大于 1700,则应执行分生孢子。
编辑
尝试此代码if [[ $extension != "jpg" ]] || ((width > 1700)) || ((height > 1700)); then
给出height: not found error
。知道为什么 bash 语法出错吗?
编辑
当我将其添加到我的脚本中时
echo $0
echo $SHELL
它打印
source/images/shrink_img.sh
/bin/bash
所以 bash 应该有效吗?我不知道为什么这个条件语法会破坏事情。我尝试将文件扩展名从 .sh
更改为 .bash
,并使用 bash
而不是sh
调用脚本。
在 C 中,您可以在需要布尔表达式的位置放置裸0
或1
。在 shell 脚本中并非如此。也不能在单个方括号内使用&&
和||
。他们需要在外面。
选项 1:显式编写所有三个测试。
if [[ $extension != "jpg" ]] || ((width > 1700)) || ((height > 1700)); then
选项 2:使用"布尔"变量。
((big_width = width > 1700))
((big_height = height > 1700))
if [[ $extension != "jpg" ]] || ((big_width)) || ((big_height)); then
选项 3:将测试隐藏在函数后面。
big_width () { ((width > 1700)); }
big_height() { ((height > 1700)); }
if [[ $extension != "jpg" ]] || big_width || big_height; then
(你会注意到我切换到了双方括号。 [[ ... ]]
比[ ... ]
更强大。有关双括号优点的深入解释,请参阅此答案。
如果我正确理解了这个问题,这段代码就可以了。如果您想更改条件,也可以玩一玩。
width=1701
height=1699
extension="jpg"
if [ $extension != "jpg" ] || [ $width -gt 1700 ] || [ $height -gt 1700 ];
then
echo "Yay"
else
echo "Nay"
fi
or
运算符是-o
,需要使用比较-eq 0
:
big_width=$(($width > 1700))
big_height=$(($height > 1700))
if [ $extension != "jpg" -o $big_width -eq 0 -o $big_height -eq 0 ]; then