Bashの場合、内部変数の比較

Bashの場合、内部変数の比較

if条件内で2つの変数を比較しようとしています。

#!/bin/bash
Jump="/home/Lists/srv"
S=`echo "$1" | perl -ne 'print lc'`
J1=`grep $S $Jump |awk '{print $1}'`
grep $S $Jump >> /dev/null
if [ $? = 0 ]
 then
   if [ "$S" == "$J1" ]
   then
     echo "$S" is equal to "$J1" :
     ssh -qt $S "$2"
   else
     echo "$S" is not equal to "$J1"
     ssh -qt $J1 "ssh -qt $S $2"
   fi
  else 
    ssh -qt $S "$2"
  fi

実行しようとするたびに、常に別の条件に切り替えられます。そして実行echo "$S" is not equal to "$J1"

このスクリプト./test.shの後に、次のサーバー名を実行しています。

./test.sh hostname1

その後、大文字と小文字を下げ、変数に入れてファイルからS検索する必要があります。見つかったら、最初の列を特定して別の変数に入れる必要があります。ここで、値が似ている場合は、sshをelse(最初)に、まずsshを介してelse(最初)にsshする必要があります。それ以外の場合(2番目)、ジャンプファイルに見つからない場合は、直接sshを実行する必要があります。$SJump="/home/Lists/srv"J1SJ1$S$J1$S$S$S

実行すると、最初の別の条件に直接移動します。$S似ていても$J1

ベストアンサー1

達成しようとしている目標の説明に応じて、以下を実行するスクリプトになります。

#!/bin/bash

server="${1,,}"

jumphost="$( awk -vs="$server" '$0 ~ s { print $1; exit }' "/home/Lists/srv" )"

if [[ -z "$jumphost" ]] || [[ "$jumphost" == "$server" ]]; then
    ssh -qt "$server" "$2"
else
    ssh -qt "$jumphost" "ssh -qt \"$server\" \"$2\""
fi

パラメータ拡張は${1,,}値を小文字にします$1。以前のバージョンでは、bash次のものを代わりに使用してください。

server="$( printf '%s' "$1" | tr 'A-Z' 'a-z' )"

この変数は、jumphostファイルの最初の行と最初の列の/home/Lists/srvサーバー名と一致する値に設定されます。これは単に選択することに注意してください。最初ファイル内で一致し、一致は次のとおりです。みんなラインが考慮されます。

2番目の列にのみ一致する場合は、Awkスクリプトでそれを変更します$0$2

$jumphostまたは$server等しい場合は最初の分岐が選択され、それ以外の場合は2番目の分岐が選択されます。

Awkスクリプトの説明を要求します。

jumphost="$( awk -vs="$server" '$0 ~ s { print $1; exit }'

-vAwk変数を特定の値に設定します。上記のコマンドでAwk変数をs値に設定しました$server。その後、この変数をAwkスクリプトで使用できます。

awkスクリプトでは、

$0 ~ s { print $1; exit }

{ ... }条件が true の場合、$0 ~ sその中にあるコードが実行されます。条件は$0 ~ s$0一致(正規表現)s」を意味します。この変数はs前に割り当てた値であり、awkが読み取ったばかりの現在のレコード(行)の内容です。つまり、ファイル内のサーバー名を含む行を探します。$server$0

$2 == sたとえば、2番目の列で正確に一致するように強制するには、as条件を使用できます。

のコードは、スクリプトを終了する前に(行)の最初のフィールド(列)を{ ... }印刷します。複数の行が一致しないように選択解除します。ユーザーが指定した値があいまいになると、複数の行が一致するリスクがあります。$1$0$server

jumphost$( ... )最後に、awkによって出力された値は、ほぼ同じシェル変数に割り当てられます`...`

おすすめ記事