我有一个小的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
调用脚本。
答案 0 :(得分:2)
在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
(你会注意到我切换到双方括号。[[ ... ]]
比[ ... ]
更强大。请参阅this answer深入解释双括号的优点。)
答案 1 :(得分:1)
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
答案 2 :(得分:1)
如果我正确理解了这个问题,那么这段代码就可以解决问题。如果你想改变条件,你也可以玩。
width=1701
height=1699
extension="jpg"
if [ $extension != "jpg" ] || [ $width -gt 1700 ] || [ $height -gt 1700 ];
then
echo "Yay"
else
echo "Nay"
fi