我想弄清楚如何检查第一个输入是否以.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
答案 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