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を実行する必要があります。$S
Jump="/home/Lists/srv"
J1
S
J1
$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 }'
-v
Awk変数を特定の値に設定します。上記のコマンドで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によって出力された値は、ほぼ同じシェル変数に割り当てられます`...`
。