为啥我在意外标记 `(' 附近出现语法错误

Posted

技术标签:

【中文标题】为啥我在意外标记 `(\' 附近出现语法错误【英文标题】:Why am i getting syntax error near unexpected token `('为什么我在意外标记 `(' 附近出现语法错误 【发布时间】:2022-01-18 09:14:21 【问题描述】:

我正在尝试使用 shell 脚本实现一个 linux 命令,以从忽略“output.mp4”和“_Removed.avi”的目录中删除一些文件和目录,但出现以下错误:

./test.sh: line 11: syntax error near unexpected token `('
./test.sh: line 11: `sudo rm -rf !("output.mp4"|"_Removed.avi")'

我正在实施的脚本是:

#!/bin/bash

if [ -d /home/Videos_bkp/ ]
then

cd /home/subham/Videos_bkp

sudo rm -rf !("output.mp4"|"_Removed.avi")

else

echo "Directory Not Available"

fi

#提前致谢

【问题讨论】:

如果您想使用扩展的 glob 模式匹配运算符(如 !(...)),如果尚未启用,则必须首先启用 extglob bash 选项(shopt -s extglob)。注意:您测试了目录/home/Videos_bkp/ 的存在,但您在目录/home/subham/Videos_bkp 中工作。这可能是一个错误。注意:您无需在目录中cd 即可访问其内容。 !("/home/subham/Videos_bkp/output.mp4"|"/home/subham/Videos_bkp/_Removed.avi") 也一样。 【参考方案1】:

您可以尝试这种类型的脚本。我创建它是为了删除一些文件夹之外的文件和文件夹,这就是我使用 [-maxdepth 1] 后跟文件夹名称的原因,但您也可以使用文件名。

#!/bin/bash

if [[ -d  /home/Videos_bkp/ ]];
then

cd /home/subham/Videos_bkp

find . -maxdepth 1  ! -name "output.mp4" ! -name "_Removed.avi" ! -name . -exec rm -r  \;

else

echo "Directory Not Available"

fi```

【讨论】:

当您在cd 之后调用rm 时,请确保cd 成功。在这段代码中/home/Videos_bkp//home/subham/Videos_bkp 是不同的,所以运行这个脚本可能会出错。做类似cd /home/subham/Videos_bkp || exit 1的事情。【参考方案2】:

子shell需要打开extglob。在文件头添加如下内容。

shopt -s extglob
...

【讨论】:

以上是关于为啥我在意外标记 `(' 附近出现语法错误的主要内容,如果未能解决你的问题,请参考以下文章

为啥我会出现此错误:“数组”第 2 行或附近的语法错误:值数组?

Postgresql: 在 ""ViewShifts"" 处或附近出现语法错误 为啥我在下面的查询中会出现此错误?

意外标记 `' ` 附近的语法错误

Bash 脚本:意外标记附近的语法错误?

原因:意外标记“fi”附近的 Bash 语法错误

GDRIVE:意外标记“换行符”附近的语法错误