Linux 意外标记“if';

Linux 意外标记“if';,linux,bash,ubuntu,if-statement,scripting,Linux,Bash,Ubuntu,If Statement,Scripting,我目前正在尝试编写一个bash脚本,它可以帮助我逐步浏览目录并检查文件的.jpeg或.jpg扩展名。我得出以下结论: #declare $PICPATH, etc... for file in $PICPATH if [ ${file -5} == ".jpeg" -o ${file -4} == ".jpg" ]; then #do some exif related stuff here. else #throw some error

我目前正在尝试编写一个bash脚本,它可以帮助我逐步浏览目录并检查文件的.jpeg或.jpg扩展名。我得出以下结论:

#declare $PICPATH, etc...

for file in $PICPATH
    if [ ${file -5} == ".jpeg" -o ${file -4} == ".jpg" ];
    then
        #do some exif related stuff here.
    else
        #throw some errors
    fi
done
执行时,bash在if行上不断抛出一个错误:“意外标记'if'附近的语法错误”

我是一个全新的脚本编写者;我的if语句有什么问题


谢谢。

我想你只是错过了
for
循环的do子句:

#declare $PICPATH, etc...

for file in $PICPATH; do
    if [ ${file -5} == ".jpeg" -o ${file -4} == ".jpg" ];
    then
        #do some exif related stuff here.
    else
        #throw some errors
    fi
done
是语法错误。也许你是说

${file#*.}
?

无论如何,最好是:

for file in $PICPATH; do
    image_type="$(file -i "$file" | awk '{print gensub(";", "", $2)}')"
    case $image_type in
        image/jpeg)
            # do something with jpg "$file"
        ;;
        image/png)
            # do something with png "$file"
        ;;
        *)
            echo >&2 "not implemented $image_type type "
            exit 1
        ;;
    esac
done
如果您只想处理
jpg
文件,请执行以下操作:

for file in $PICPATH; do
    image_type="$(file -i "$file" | awk '{print gensub(";", "", $2)}')"
    if [[ $image_type == image/jpeg ]]; then
            # do something with jpg "$file"
    fi
done

我不敢相信我错过了。我花了一个小时试图找出哪里出了问题。非常感谢。如果你喜欢,你可以把
do
放在新行上。然后,你可以省略它前面的分号
。同样的情况也适用于
然后
之后的
如果
。非常感谢改进的版本,但我只需要case for jpeg:所有其他内容都应该忽略。非常感谢您的回复。请参阅我编辑的文章。这里的感谢方式是对回复进行投票。您可以通过单击复选标记来接受它。这就是StackExchange问答网站的工作方式。要删除变量的最后5个字符,请使用
${file::-5}
,您正在做的
${file-5}
将无法工作。
for file in $PICPATH; do
    image_type="$(file -i "$file" | awk '{print gensub(";", "", $2)}')"
    if [[ $image_type == image/jpeg ]]; then
            # do something with jpg "$file"
    fi
done