当前位置: 首页 > 面试题库 >

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

孔逸春
2023-03-14
问题内容

我想运行一个sh文件:

#!/bin/bash
for f in !(*.sh); do
    ffmpeg -i "$f" -vf yadif=0:-1 -threads 0 -c:v libx264 -pix_fmt yuv420p \
        -r 29.97 -b:v 3000k -s 1280x720 -preset:v slow -profile:v Main \
        -level 3.1 -bf 2 -movflags faststart /mnt/media/out-mp4/"${f%.mxf}.mp4"
    rm $f
done

但是,出现以下错误:

2: task1.sh: Syntax error: "(" unexpected

如果我直接在命令行上尝试,它会完美运行。

路径和权限已被检查

知道会发生什么吗?


问题答案:

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

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

shopt -s extglob

…以启用这些功能。

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

#!/bin/bash

shopt -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在双引号内。


 类似资料:
  • 问题内容: 我要运行此脚本: 我将其运行为: 然后我得到“ ”。我发现了一些类似的情况,但仍然无法解决。我是shell脚本的初学者,但据我了解: 我使用的shebang是正确的,并选择了bash shell,所以流程替换语法应该可以工作 我从命令行尝试了同样的方法,并且可以正常工作。我检查了一下,它给了我“ ”,那么与在命令行中运行命令和调用同一shell的脚本有什么区别? 也许这很简单,但是我找

  • 问题内容: 运行此脚本 给出错误: cleanup.bash:第10行:意外令牌’(’附近的语法错误 cleanup.bash:第10行:’rm -rf!(composer.json | .git)’ 但是如果我直接在终端中运行没问题 我试着去掉所有其他行,仍然得到错误。 如何在bash脚本中正确输入? 问题答案: 我猜您的问题是由于从脚本运行时未设置shell扩展glob选项。当您声称它可以在命

  • 问题内容: 我在Mac上写了一个示例脚本 通过显示Example可以正常工作 当我在RedHat机器上运行此脚本时,它说 意外令牌附近的语法错误’ 我检查了bash是否可用 有人遇到过同样的问题吗? 提前致谢 ! 问题答案: 这可能是文件编码问题。 在不同操作系统和编辑器之间处理文件时遇到了文件类型编码问题,在我的情况下,尤其是在Linux和Windows系统之间。 我建议检查文件的编码,以确保它

  • 我正在使用一种新的语言,我想它是linux,但老实说,我不知道;我们通过一个名为putty的程序连接到某个服务器来进行编程。作为作业的一部分,我必须创建一个计算器程序,以两个数字和一个运算符作为分段,但我得到了一堆意想不到的令牌错误。我很迷茫,我的课文和我的教授都没有帮助 到目前为止,我只是想得到它,这样我就可以从命令中得到2/calc.sh 1 1但我在第20行中不断遇到意外的标记错误

  • 我写了一个脚本,脚本的一部分如下: 当我运行这个脚本时,我得到了错误, 1)行尾有问题吗?我在 Windows 上使用记事本编写了脚本,但我在编辑为 UNIX/OSX 格式下启用了 EOL 转换。 2)如果不是行尾,是什么错误? 我正在Redhat Linux操作系统上的bash shell中运行此脚本。

  • 问题内容: 问题答案: 您要在UNIX命令提示符下键入此命令吗?您应该在python环境中执行此操作,即。在提示符下键入,然后从那里开始。 另外,在Python行的末尾不需要