基本bash语法问题 - 意外令牌附近的语法错误

时间:2013-08-01 17:50:14

标签: linux bash unix syntax

我认为我的脚本完成了它的意图,起初我只是

#!/bin/bash
for file in /home/parallels/Desktop/trashcan/*
    do
    echo "Would you like to delete - " $file 
done 

然后我想添加明显缺少的功能,所以我现在有

#!/bin/bash
for file in /home/parallels/Desktop/trashcan/*
do
    echo "Would you like to delete - " $file
    read line
    if [$line == y|Y]
        sudo rm $file
fi
done 

多数民众赞成在我现在的位置,我首先尝试使用case语句而不是if,因为我有一个工作脚本,我需要的case语句,但只是复制它给我同样的错误 - 未完成令牌附近的语法错误,我得到了这个for fi并完成了

3 个答案:

答案 0 :(得分:1)

[是一个命令,因此它必须用第一个参数的空格分隔:

if [ "$line" = y ] || [ "$line" = Y ]; then
    sudo rm "$file"
fi

如果您使用的是bash,则可以用更简洁的方式替换上面显示的标准用法

if [[ $line = [yY] ]]; then
    sudo rm "$file"
fi

正如Keith Thompson指出的那样,只有'y'或'Y'的答案才能删除文件。要允许“是”或“是”,您可以使用

shopt -s extglob
if [[ $line = [yY]?(es) ]]

(只有早期版本的shopt才需要bash行。从版本4开始,扩展模式是条件表达式中的默认模式。)

答案 1 :(得分:0)

if部分应为

if [ "$line" = "y" ] || [ "$line" = "Y" ]
then
    sudo rm $file
fi

答案 2 :(得分:0)

我遇到了类似的问题。我在Windows中打开了.sh文件,Windows在每一行的末尾添加了CRLF。

我通过运行

找到了这个
cat --show-nonprinting filename.extension

E.g。

cat --show-nonprinting test.sh

然后,我使用

转换它
dos2unix filename.extension

E.g。

dos2unix myfile.txt
dos2unix myshell.sh