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
通常、これらのパターンを理解していないシェルで実行されているスクリプトで拡張されたグローブパターンを使用しようとしています。
または(各シェルで適切なオプションを設定する)など、bash
これらのモードを理解するシェルに切り替えるか、次のように理解することを使用します。ksh
zsh
/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
完全find
に利用可能な述語を実行する必要はほとんどありません。-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