我正在尝试比较 if 条件内的两个变量:
#!/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
搜索。如果找到,则应 grep 第一列并将其放入另一个变量中。现在,如果和的值相似,那么它应该 ssh 到else (1st) 它应该首先 ssh 到,然后 ssh 到。否则(第二)如果在跳转文件中找不到它应该直接 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
与服务器名称匹配的任何内容。请注意,这仅挑选出第一的文件中的匹配项并且匹配项采用所有的线纳入考虑。
如果匹配仅针对第二列,请在 Awk 脚本中更改$0
为。$2
如果$jumphost
为空,或者与 相同$server
,则采用第一个分支,否则采用第二个分支。
要求对 Awk 脚本进行解释:
jumphost="$( awk -vs="$server" '$0 ~ s { print $1; exit }'
将-v
Awk 变量设置为特定值。在上面的命令中,我们将 Awk 变量设置s
为 的值$server
。然后,该变量可在 Awk 脚本中使用。
在 awk 脚本中,
$0 ~ s { print $1; exit }
{ ... }
只要条件$0 ~ s
为真,就会执行其中的代码。条件的$0 ~ s
意思是“$0
匹配(正则表达式)s
”。该变量是我们之前s
赋予的值,并且是 awk 刚刚读取的当前记录(行)的内容。简而言之,这会在文件中找到包含服务器名称的行。$server
$0
要强制在第二列上进行精确匹配(例如),可以使用$2 == s
as 条件。
中的代码将在退出脚本之前{ ... }
打印$1
,这是(行)的第一个字段(列) 。$0
我选择退出,这样我们就不会匹配超过一行。如果用户指定的值太模糊$server
,我们就会面临匹配多行的风险。
jumphost
最后,awk输出的值会通过赋给shell变量$( ... )
,与 大致相同`...`
。