BASH如果一行中的第9个字符是特定字母;然后

时间:2016-08-25 13:35:11

标签: bash if-statement

如果行的第9个字符" $ q"如何执行某些步骤是A,B,C,D还是E.有点像?

if [ ${q:9} == [A,B,C,D,E]; then

(如果第9个字符是大写字母A,B,C,D或E,那么;)

我已使用if [ ${q:9} == A ];来匹配一个字母,并尝试构建类似上面的内容或:if [[ "${p:9}" == "A" && "$p" == "B" && "$p" == "C" "$p" == "D" "$p" == "E"]]; then以匹配多个字母,但无论运算符如何都似乎无效我用。

4 个答案:

答案 0 :(得分:2)

使用case声明:

case ${q:9} in

     [A-E])
     echo found
     ;;

esac

答案 1 :(得分:2)

只需检查第9个字符with a regex的值:

[[ "${var:8:1}" =~ (A|B|C|D|E) ]]

例如:

$ v=12345678Axx
$ [[ "${v:8:1}" =~ (A|B|C|D) ]] && echo "yes" || echo "no"
yes
$ v=1234567890
$ [[ "${v:8:1}" =~ (A|B|C|D) ]] && echo "yes" || echo "no"
no

要获得第9个字符,我使用Bash Reference Manual → 3.5.3 Shell Parameter Expansion,因此第9个字符为${var:8:1},因为索引是从0开始的(第一个是0 th ) :

${parameter:offset:length}
     

这称为子字符串扩展。它扩展到长度   从字符开始的参数值的字符   由offset指定。如果参数为'@',则下标索引数组   通过'@'或'*'或关联数组名称,结果不同   如下面所描述的。如果省略length,则会扩展为子串   参数的值从offset指定的字符开始   并延伸到价值的末尾。长度和偏移量   算术表达式(参见Shell算术)。

     

如果offset的计算结果小于零,则该值用作   从参数值的末尾开始的字符偏移量。如果   length计算为小于零的数字,它被解释为   从参数值的末尾开始的字符偏移   比一些字符,扩展是字符   在偏移和结果之间。请注意,负偏移必须是   与结肠分开至少一个空间以避免混淆   用': - '扩展。

答案 2 :(得分:2)

使用正则表达式,您可以选择匹配单个字符或带有任意8个字符前缀的字符串:

if [[ ${q:8:1} =~ [ABCDE] ]]; then

if [[ $q =~ ^.{8}[ABCDE] ]]; then

您也可以使用模式匹配,但在这种情况下,它看起来与正则表达式完全相同:

if [[ ${q:8:1} == [ABCDE] ]]; then

答案 3 :(得分:1)

试试:

if [[ ${q:9:1} =~ [ABCDE] ]]; then

${q:9}返回第9个开头的所有字符(注意,计数从0开始)。 ${q:9:1}仅返回第9个字符中的一个字符。 =~运算符是"匹配正则表达式"操作