检查bash脚本输入变量是否为字母

时间:2018-01-24 10:52:46

标签: bash if-statement

我想根据我提供的参数向ssh写一个简短的脚本到不同的服务器 - 如果它是一个数字,我希望该数字是服务器名称的一部分,如果它是一个字母我希望它连接到某个服务器。到目前为止,我有这个:

#!/bin/bash

if [ $1 -eq ^[1,3-5]$ ]; then
        ssh -X servername1$1
elif [ $1=h ]; then
        ssh -X servername2
fi

但它一直抱怨整数表达式是预期的,并且总是尝试连接到servername2,无论我给它一个数字还是一个字母。 我尝试了第一次和第二次比较的引号,我在第二次比较中尝试了双等号 - 都无济于事。我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:1)

[ $1 -eq ^[1,3-5]$ ]不是bash语法。

你可以这样写:

#!/bin/bash

if [[ $1 =~ ^[1,3-5]$ ]]; then
        echo "$1 integer"
elif [ $1 = h ]; then
        echo "$1 letter" 
fi

输出:

[sahaquiel@sahaquiel-PC Stackoverflow]$ ./numorlet.sh 1
1 integer
[sahaquiel@sahaquiel-PC Stackoverflow]$ ./numorlet.sh 3
3 integer
[sahaquiel@sahaquiel-PC Stackoverflow]$ ./numorlet.sh 10
[sahaquiel@sahaquiel-PC Stackoverflow]$ ./numorlet.sh h
h letter
[sahaquiel@sahaquiel-PC Stackoverflow]$ ./numorlet.sh hhhh
[sahaquiel@sahaquiel-PC Stackoverflow]$ 

另外,请告诉我,如果这封信只是' h,或者它可以是任何一个? 如果有,请在[[条件下使用[代替elif,使用正则表达式(我认为^[a-zA-Z]$会有效)

答案 1 :(得分:1)

我想你有一个服务器列表,你从中获取参数$1。 如果是,您将不得不对代码进行一些更改。

#!/bin/bash

if [[ $1 -eq ^[1,3-5]$ ]]; then
        ssh -X servername1$1 < /dev/null
elif [[ $1==h ]]; then
        ssh -X servername2 < /dev/null
fi

SSH通过添加来自stdin的输入从/dev/null获取输入,您正在告诉ssh从该特定文件中获取输入。

使用[[...]]表示if有表达式。

您可以在this link "Confused about operators"

中详细了解[[..]]

同样$1=h是作业而非比较; ==用于比较。