編集する

編集する

値=${VAR |

シェルスクリプトでこの変数割り当てを見つけました。ここで||シンボルが使用される理由を理解できません。

編集する

与えられたコードコメント:

#!/bin/bash
source /opt/cpf/bin/cpf_logging_helper.sh
STATE=$1
DNS_MASTER=${TEST.DNS.DNS_MASTER:-o}
service status dns > /dev/null
rval=$?
if [ $rval -eq 0 ]
then
    if [ $DNS_MASTER == `hostname -s` ]
    then
        echo "1"
    else
        echo "2"
    fi
fi

答え1

元のエンコーダは、値が設定されていない場合はその$VAR値を使用することを意図しているようです。oこれは、bash次の方法を使用して達成できます。

VALUE=${VAR:-o}

また、参照しman bashて検索Parameter Expansionしたり、:-

答え2

この構造は、VALUE=${VAR| |o}dash、bash、ksh、zsh では無効です。

もしこれは| |実際に/ /bashで意味のある(?)thenです。

つまり、最初のスペースをに置き換えますo

これが合理的な交換であるかどうかは別の問題です。私はそれが本当だと信じていません。

編集時に追加されたコードでは、ドットは、dash、bash、またはzshの変数名、またはkshの非常に特定の条件では無効です。
bashでは失敗します。

DNS_MASTER=${TEST.DNS.DNS_MASTER:-o}

また、このテストは、スペースとホスト名コマンドが実行されないという事実のために正しくありません。

if [ $DNS_MASTER == hostname -s ]

使用:

if [ "$DNS_MASTER" == "$(hostname -s)" ]

要約すると、提供されたコードはbashで正しく機能せず、ほとんどのシェルで混乱しています。関連性のある質問を編集します。

答え3

私が考えることができる最も近いシェル演算子は次のとおりです。バッシュパッチWilliam Park は、2004 年から 2008 年までこのバージョンを維持しており、これには bash3 の多少便利な拡張機能が含まれています。

Aシリーズがあります。パラメータ拡張演算子すべては${var|...}これらの連想zshパラメータフラグの一部で始まります(構文はまったく異なりますが)。

そのシェルでは、(とほぼ同じ)${var| |o}と解析されますが、有効なコマンド名と見なされないため、エラーが発生します(その名前でコマンドを生成した場合も同様)。${var|cmd}$(cmd "$var"}invalid command|o

関連情報