0
type
の変数がparent
に等しくなく、parents
の配列がchildren
の配列の現在の要素を含む場合、以下のスクリプトの式が真となる必要があります。なぜそれは常に偽ですか?私は、配列の最初の要素を反復処理するときに、dev-php skipped
を出力することを期待していました。式が期待通りに解決されません
表現の右部分を削除してif [[ ${parents[*]} =~ ${d} ]] ; then
のように見えるのは、必要に応じて機能することです。どうしましたか?
#!/bin/bash
set -e
declare -a parents=(dev-php test1 test2)
declare -a children=(dev-php something-else)
type="child"
for d in ${children[@]} ; do
echo "testing ${d}"
if [[ ${parents[*]} =~ ${d} && ${type} -ne parent ]] ; then
echo "${d} skipped"
else
echo "${d} NOT skipped"
fi
done
ここで扱ういくつかの怪しげな文字列があります。 '$ {children [@]}'の 'for d 'は、誤って解析するのを防ぐために' $ {children [@]} 'を二重引用符で囲む必要があります。 '$ d'が' parents'配列内の何かの部分文字列であれば '$ {parents [*]} =〜$ {d}'はマッチします(例えば "test"は "test1"、 "test1"は「test10」にマッチするなど)。また、 '$ d'に正規表現のメタキャラクタが含まれていると、事態が本当に奇妙になることがあります。私は '$ {parents [*]}" = * "$ d" * 'を使用します(これは、空白を含む項目があれば失敗する可能性がありますが、現在のバージョンほど悪くはありません)。 –
@GordonDavisson Bashスクリプトは私にとって魔法のようなものです。 '$ d'と' $ {parents [*]} 'のスペースのポイントは何ですか? – Sergey
アイテムの* parts *とのマッチングを防止します。たとえば、 "test"は "dev-php test1 test2"の部分文字列ですが、 "test1"は "dev-php test1 test2"の部分文字列ではありません。 bashには奇妙なことがたくさんありますが、これは一般的な文字列操作のトリッキーなことです。ところで、シェルスクリプトを学んでいるときは、[shellcheck.net](http://www.shellcheck.net)をお勧めします。よくある間違いを指摘し、頭痛を軽減します。 –