如果语句语法错误

时间:2017-02-04 20:20:20

标签: shell if-statement sh

我想弄清楚如何检查第一个输入是否以.txt结尾。根据我获取输入的方式,似乎标准if语句语法不适用于我的代码。有没有人知道我的代码中第一个if语句中else if语句的正确语法?

 #!/bin/sh

printf "%b %b\n" "$*"

if [ "$1" = "-help" ]
then
    echo "Cool Beans"
elif [ "$1" = "*.txt" ]
then
    echo "text recd"

else
    echo "first input not valid"
fi

if [ "$2" = "-help" ]
then
    echo "help options"
else
    echo "second input not valid"
fi

2 个答案:

答案 0 :(得分:2)

为了使模式匹配起作用,可以使用Bash双括号条件(同时删除引号,禁用匹配):

elif [[ "$1" = *.txt ]]

您还可以使用正则表达式匹配:

elif [[ "$1" =~ [.]txt$ ]]

请注意,你必须逃避句点(或者像我一样把它放在括号中)以防止其“任何字符”的特殊含义被禁用,以及使用$将正则表达式锚定到最后您确定要匹配扩展名,而不是文件名中的子字符串。

如果你想要一些不是特定于bash的东西,你可以尝试:

elif [ "${1##*.}" = txt ]

"${1##*.}"扩展删除从名为1的变量的开头开始的最长字符串(可以是任何变量),以句点结束,只留下扩展名。

答案 1 :(得分:0)

您还可以使用case语句进行POSIX兼容模式匹配:

printf "%b %b\n" "$*"

case $1 in
  -help) echo "Cool Beans" ;;
  *.txt) echo "text recd" ;;
  *) echo "first input not valid"
esac

case $2 in
  -help) echo "help options" ;;
  *) echo "second input not valid" ;;
esac