意外标记附近的语法错误

意外标记附近的语法错误

我在 jenkins 中运行这个命令,它使用 sh。但是我不确定这个错误在我的 bash 脚本中意味着什么

#! /bin/sh
for d in $(ls -d kube/xx/bb/!(abc*|!cdf*)/ | xargs -I {} basename {} ) ;do echo $d; done
test.sh: command substitution: line 3: syntax error near unexpected
token `(' test.sh: command substitution: line 3:
`ls -d kube/xx/bb/!(abc*|!cdf*)/ | xargs -I {} basename {} )'

答案1

您正尝试在 下运行的脚本中使用扩展的通配模式/bin/sh,该 shell 通常不理解此类模式。

要么切换到了解这些模式的 shell,例如bashkshzsh(在每个 shell 中设置适当的选项),或者使用/bin/sh可以理解的东西,例如find

#!/bin/sh

find kube/xx/bb -prune ! -name 'abc*' ! -name 'cdf*' -type d -exec basename {} \;

或者,如果您使用的是 GNU find

#!/bin/sh

find kube/xx/bb -prune ! -name 'abc*' ! -name 'cdf*' -type d -printf '%f\n'

在这两个示例中,我假设问题中!的前面是一个拼写错误。cdf*

请注意,很少需要xargs在管道中运行findasfind具有完美可用的-exec谓词来执行任意复杂的命令。

还,为什么*不*解析`ls`(以及该怎么做)?


更手动的方法:

#!/bin/sh

for pathname in kube/xx/bb/*/; do
    [ -d "$pathname" ] || continue

    name=${pathname%/}
    name=${name#kube/xx/bb/}

    case $name in
        abc*|cdf*) continue ;;
    esac

    printf '%s\n' "$name"
done

相关内容