我在 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,例如bash
、ksh
或zsh
(在每个 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
在管道中运行find
asfind
具有完美可用的-exec
谓词来执行任意复杂的命令。
更手动的方法:
#!/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