bash脚本执行报`syntax error near unexpected token '('`找不到原因
报错原因排查
- 进程替换语法书写错误
bash 进程替换的标准语法为<(命令),<与(之间不允许存在空格。你代码中写的< (printf ...)多了多余空格,会让shell将<识别为普通输入重定向符,后续的(就成了非法语法标记,直接触发对应报错。
修正后的代码片段如下:
# match PLEX_REMOTE_DYNDNS IPs against resolved IPs matched_ips=( $(comm -12 <(printf '%s\n' "${trusted_wan[@]}" | LC_ALL=C sort) <(printf '%s\n' "${resolved_ips[@]}" | LC_ALL=C sort)) )
- 执行脚本的shell不支持进程替换特性
进程替换属于bash、zsh等shell的扩展特性,不属于POSIX标准。如果脚本开头shebang写为#!/bin/sh,或者使用sh 脚本名.sh的方式执行,系统会调用dash这类兼容POSIX的轻量shell运行,无法识别进程替换语法,就会报括号相关语法错误。
解决方法:- 脚本开头指定bash作为解释器,写为
#!/bin/bash或#!/usr/bin/env bash - 执行脚本时使用
bash 脚本名.sh,不要用sh执行
- 脚本开头指定bash作为解释器,写为
- bash运行在POSIX兼容模式下
如果脚本中配置了set -o posix,或者运行环境默认强制开启bash POSIX模式,进程替换特性会被禁用,也会触发该报错。
解决方法:移除脚本中set -o posix配置,或执行脚本前手动关闭POSIX模式。
内容的提问来源于stack exchange,提问作者Vladimir Knysh
相关产品推荐
相关产品推荐

