栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

语法错误:“(”意外—在bash脚本中带有!(*。sh)

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

语法错误:“(”意外—在bash脚本中带有!(*。sh)

这不是“ sh文件”,而是 bash 脚本。如果使用来运行它

shyourscript
,它将不起作用(因为extixlobs,即您要使用的shell功能,在POSIX sh中不受支持);它需要仅与运行
bashyourscript
,或用
./yourscript
与启动时
#!/bin/bash
(因为它)。因此,将其描述为“
sh文件”会产生误导。而且,即使使用bash,也需要打开扩展的globing功能。


您的直接问题是,

!(*.sh)
它不是常规的glob语法;它是extglob扩展名,默认情况下不可用。您可能具有一个
.bashrc
或类似的配置文件,该文件为交互式shell启用了此扩展,但不适用于脚本。跑:

shopt -s extglob

…以启用这些功能。


清理后,您的脚本可能如下所示:

#!/bin/bashshopt -s extglob# putting settings in an array allows unescaped newlines in definition# also sorted to make it easier to find things.settings=(  -b:v 3000k  -bf 2  -c:v libx264  -level 3.1  -movflags faststart  -pix_fmt yuv420p  -preset:v slow  -profile:v Main  -r 29.97  -s 1280x720  -threads 0  -vf yadif=0:-1)for f in !(*.sh); do    ffmpeg "${settings[@]}" -i "$f"       /mnt/media/out-mp4/"${f%.mxf}.mp4" && rm -- "$f"done

请注意除格式之外的以下更改:

  • shopt -s extglob
    在扩展全局范围之前是独立的。
  • rm
    仅在
    ffmpeg
    成功的情况下运行,因为这些命令之间的分隔符为
    &&
    ,而不是两个
    ;
    或一个空的换行符。
  • --
    传递给的参数
    rm
    告诉它将所有以后的参数(在本例中为的内容
    "$f"
    )都视为文件名,即使它以短划线开头也是如此。
  • "$f"
    参数
    rm
    在双引号内。


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/403098.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号