改编脚本检测字幕格式时遇语法错误,求排查解决
问题排查:Bash字幕格式检测脚本语法错误
错误原因
你遇到的unexpected token '('错误,是因为脚本里用了+([0-9])这种扩展通配符(extglob),而Bash默认没有启用extglob选项,导致shell无法解析这种语法。
修复方案
在脚本开头(#!/bin/bash之后)添加一行开启extglob的命令:
shopt -s extglob
如果脚本需要在严格POSIX模式下运行,extglob会失效,这种情况可以把case里的扩展通配符替换成标准glob,或者改用[[ ... =~ ]]的正则匹配方式。
修改后的完整脚本
#!/bin/bash shopt -s extglob subfmt_convert__fmt_detect() { local file="$1" line local -i c=0 max_lines=40 fmt_detect_ret= local NB_FD_FILE exec {NB_FD_FILE}<"$file" # szybsze od subotage.sh o ok 10 do 300 razy... Wykrywa te same formaty. while read -u $NB_FD_FILE line; do c+=1; test "$c" -gt "$max_lines" && break case "${line:0:1}" in "{"|'[') case "$line" in '{'+([0-9])'}{'*([0-9])'}'*) fmt_detect_ret='microdvd' break ;; '['+([0-9])']['*([0-9])']'*) fmt_detect_ret='mpl2' break ;; esac ;; 0) case "$line" in 00:[0-5][0-9]:[0-5][0-9],[0-9][0-9][0-9]' --> '00:[0-5][0-9]:[0-5][0-9],[0-9][0-9][0-9]*) fmt_detect_ret='subrip' break ;; 00:[0-5][0-9]:[0-5][0-9]:[0-9][0-9],00:[0-5][0-9]:[0-5][0-9]:[0-9][0-9]*) fmt_detect_ret='subview' break ;; 0?(0):[0-5][0-9]:[0-5][0-9]:*) fmt_detect_ret='tmplayer' break ;; +([0-9])' : 00:'[0-5][0-9]:[0-5][0-9]:[0-9][0-9]+( )00:[0-5][0-9]:[0-5][0-9]:[0-9][0-9]*) fmt_detect_ret='fab' break ;; esac ;; esac done exec {NB_FD_FILE}>&- echo "$fmt_detect_ret" } subfmt_convert__fmt_detect "$1"
补充说明
shopt -s extglob会开启Bash的扩展通配符支持,允许使用+()、?()、*()这类模式匹配语法。- 如果脚本需要在不支持extglob的shell环境运行,可以把case语句里的扩展通配符替换为标准glob(比如用
[0-9]*代替+([0-9]),但匹配精度会略有下降),或者改用[[ $line =~ 正则表达式 ]]的方式进行匹配。
内容的提问来源于stack exchange,提问作者D S
相关产品推荐
相关产品推荐

