【问题标题】: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") 也一样。

标签: bash shell scripting


【解决方案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
...

【讨论】:

    猜你喜欢
    • 2011-05-27
    • 2017-12-03
    • 2013-01-22
    • 2012-08-31
    • 2012-10-20
    • 2012-09-29
    • 2013-12-11
    • 1970-01-01
    相关资源
    最近更新 更多