【问题标题】:basic bash syntax issue - syntax error near unexpected token基本 bash 语法问题 - 意外标记附近的语法错误
【发布时间】:2013-08-02 19:02:36
【问题描述】:

我认为我的脚本做了它应该做的事情,起初我只是有

#!/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 语句的工作脚本,但简单地复制它会给我同样的错误 -意外令牌附近的语法错误,我得到这个 fi 并完成

【问题讨论】:

  • 我相信您需要在[ 后面和] 之前有空格。而且我不确定| or 是否会起作用。你能试试[ $line == y ]吗?
  • 通过任一答案中的修复,这仍会将“是”或“是”的输入视为“否”。

标签: linux bash unix syntax


【解决方案1】:

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

我通过运行发现了这一点

cat --show-nonprinting filename.extension

例如

cat --show-nonprinting test.sh

然后,我使用它转换它

dos2unix filename.extension

例如

dos2unix myfile.txt
dos2unix myshell.sh

【讨论】:

    【解决方案2】:

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

    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 开始,扩展模式是条件表达式中的默认设置。)

    【讨论】:

    • 谢谢!这非常有效,我已经从这个错误中吸取了教训,我很感激时间。
    【解决方案3】:

    if 部分应该是

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

    【讨论】:

      猜你喜欢
      • 2014-02-26
      • 2018-12-18
      • 2014-01-20
      • 2015-12-11
      • 2021-07-29
      • 2014-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多