4つの変数のいずれかがkshで&red文字列で始まることを確認してください。

4つの変数のいずれかがkshで&red文字列で始まることを確認してください。

4つの変数のうちの1つが文字列 "&red"で始まることを確認し、一致するものが機能するようにします。現在私はこれを持っています。

if [[ $filemsgCICS = "&red"* || $filemsgCICSU1 = "&red"* || $snufmsgCICS = "&red"* || $snufmsgCICSU1 = "&red"* ]];then

しかし、これはうまくいきません。効果的な解決策が見つからないようです。 '&red'*と\&red*を試しましたが、どちらも機能しません。

答え1

${variable:offset:length} 構文を使用して、次のように変数の一部を取得できます。

if [[ ${filemsgCICS:0:4} = "&red" || ${filemsgCICSU1:0:4} = "&red" || \
  ${snufmsgCICS:0:4} = "&red" || ${snufmsgCICSU1:0:4} = "&red" ]]; then

編集する:*が[[]]と一致しないという意見が間違っています。変数に期待されるテキストが含まれている場合でも、アプローチは機能するはずです。だからこれは単なる選択肢です。

答え2

awkandループを使用できますfor

matched=0
for var in "$filemsgCICS" "$filemsgCICSU1" "$snufmsgCICS" "$snufmsgCICSU1";do
   if [ ! -z "$(printf "%s\n" "$var" | awk '/^\&red/')" ]; then
       matched=1
       break
   fi
done
if [ "$matched" -eq 1 ]; then
   # do stuff...
fi

これは、最初の一致変数でループを中断し、論理ORセマンティクスを実装します。awk次のようなものを使用してこれを達成することもできます。

if    [ ! -z "$(printf "%s\n" "$filemsgCICS" | awk ...)" ]\
   || [ ! -z "$(printf "%s\n" "$filemsgCICSU1" ...

しかし、私の考えでは、ループを使用すると読みやすく、メンテナンスも簡単になります。

関連情報