2017-10-31 11 views
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 
+1

ここで扱ういくつかの怪しげな文字列があります。 '$ {children [@]}'の 'for d 'は、誤って解析するのを防ぐために' $ {children [@]} 'を二重引用符で囲む必要があります。 '$ d'が' parents'配列内の何かの部分文字列であれば '$ {parents [*]} =〜$ {d}'はマッチします(例えば "test"は "test1"、 "test1"は「test10」にマッチするなど)。また、 '$ d'に正規表現のメタキャラクタが含まれていると、事態が本当に奇妙になることがあります。私は '$ {parents [*]}" = * "$ d" * 'を使用します(これは、空白を含む項目があれば失敗する可能性がありますが、現在のバージョンほど悪くはありません)。 –

+0

@GordonDavisson Bashスクリプトは私にとって魔法のようなものです。 '$ d'と' $ {parents [*]} 'のスペースのポイントは何ですか? – Sergey

+1

アイテムの* parts *とのマッチングを防止します。たとえば、 "test"は "dev-php test1 test2"の部分文字列ですが、 "test1"は "dev-php test1 test2"の部分文字列ではありません。 bashには奇妙なことがたくさんありますが、これは一般的な文字列操作のトリッキーなことです。ところで、シェルスクリプトを学んでいるときは、[shellcheck.net](http://www.shellcheck.net)をお勧めします。よくある間違いを指摘し、頭痛を軽減します。 –

答えて

2
${type} -ne parent 

-ne算術演算子です。文字列には!=を使用してください。

$type != parent 

(中括弧の必要はありません。)

関連する問題