我想运行一个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行的末尾不需要