我正在尝试比较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
然后执行ex的服务器名称:
./test.sh hostname1
然后,应减小大小写并将其放在变量中S
,然后$S
在文件中搜索Jump="/home/Lists/srv"
。如果找到它,则应grep第一列并将其放在另一个变量中J1
。现在,如果价值S
和J1
是相似的,那么就应该ssh到$S
其他(1)它首先应该ssh来$J1
,然后ssh来$S
。其他(第二个)如果$S
在Jump文件中找不到,则应直接使用ssh $S
。
当我执行它时,它会直接进入其他条件。即使$S
和$J1
相似。
根据您对要实现的目标的描述,以下可能是执行此操作的脚本:
#!/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
中与服务器名称匹配的第一行第一列中的任何内容。请注意,这仅挑选出文件中的第一个匹配项,并且该匹配项考虑了整行。
如果匹配项仅应与第二列匹配,$0
请$2
在Awk脚本中更改为。
如果$jumphost
为空,或者与相同$server
,则将采用第一个分支,否则将采用第二个分支。
要求对Awk脚本进行说明:
jumphost="$( awk -vs="$server" '$0 ~ s { print $1; exit }'
使用-v
Awk可以将Awk变量设置为特定值。在上面的命令中,我们将Awk变量设置s
为的值$server
。然后,该变量在Awk脚本中可用。
在Awk脚本中,
$0 ~ s { print $1; exit }
{ ... }
条件$0 ~ s
为真时,将执行其中的代码。条件的$0 ~ s
意思是“$0
匹配(正则表达式)s
”。变量s
是我们给$server
之前的值,$0
是Awk刚刚读取的当前记录(行)的内容。简而言之,这会在文件中找到包含服务器名称的一行。
要在第二列上强制进行完全匹配(例如),可以改为使用$2 == s
该条件。
中的代码{ ... }
将在退出脚本之前打印$1
,这是(行)的第一个字段(列)$0
。我选择退出,以便最终匹配不超过一行。如果用户为指定了太模糊的值$server
,则冒着匹配多行的风险。
最后,通过在awk输出的值将被分配给外壳变量jumphost
通过$( ... )
,这是大致相同`...`
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句