Shell 条件错误 - Bash 语法无法识别
Shell conditional errors out - Bash syntax not recognized
我有一点 shell 脚本,似乎无法弄清楚如何创建简单的条件语句。
big_width=$(($width > 1700))
big_height=$(($height > 1700))
if [ $extension != "jpg" || $big_width || $big_height ]; then
给出错误
[: missing ]
0: not found
如果这能给我我想要的,我也知道。如果 $extension != "jpg
或 width/height 变量之一大于 1700,则应执行条件。
编辑
尝试此代码 if [[ $extension != "jpg" ]] || ((width > 1700)) || ((height > 1700)); then
得到 height: not found error
。知道为什么 bash 语法会出错吗?
编辑
当我将它添加到我的脚本时
echo [=14=]
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: 使用 "boolean" 个变量。
((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 以深入了解双括号的优势.)
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
如果我对问题的理解正确,这段代码就可以解决问题。想换个条件也可以玩玩
width=1701
height=1699
extension="jpg"
if [ $extension != "jpg" ] || [ $width -gt 1700 ] || [ $height -gt 1700 ];
then
echo "Yay"
else
echo "Nay"
fi
我有一点 shell 脚本,似乎无法弄清楚如何创建简单的条件语句。
big_width=$(($width > 1700))
big_height=$(($height > 1700))
if [ $extension != "jpg" || $big_width || $big_height ]; then
给出错误
[: missing ]
0: not found
如果这能给我我想要的,我也知道。如果 $extension != "jpg
或 width/height 变量之一大于 1700,则应执行条件。
编辑
尝试此代码 if [[ $extension != "jpg" ]] || ((width > 1700)) || ((height > 1700)); then
得到 height: not found error
。知道为什么 bash 语法会出错吗?
编辑
当我将它添加到我的脚本时
echo [=14=]
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: 使用 "boolean" 个变量。
((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 以深入了解双括号的优势.)
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
如果我对问题的理解正确,这段代码就可以解决问题。想换个条件也可以玩玩
width=1701
height=1699
extension="jpg"
if [ $extension != "jpg" ] || [ $width -gt 1700 ] || [ $height -gt 1700 ];
then
echo "Yay"
else
echo "Nay"
fi