为啥我在意外标记 `(' 附近出现语法错误
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 行或附近的语法错误:值数组?