Shell If语句语法
我试图找出如何检查第一次输入是否以Shell If语句语法,shell,if-statement,sh,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
.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
为了使模式匹配工作,可以使用Bash双括号条件(同时删除引号,从而禁用匹配): 还可以使用正则表达式匹配:
elif [[ "$1" = *.txt ]]
elif [[ "$1" =~ [.]txt$ ]]
请注意,您必须转义句点(或像我一样将其放在括号中),以防止禁用其特殊含义“任何字符”,并使用$
将正则表达式锚定到结尾,以便确保您匹配的是扩展名,而不是文件名中的子字符串
如果您想要不特定于bash的内容,可以尝试:
elif [ "${1##*.}" = txt ]
“${1###*.}”
扩展将删除从名为1的变量(可以是任何变量)的开头开始并以句点结束的最长字符串,只保留扩展名。为了使模式匹配工作,可以使用Bash双括号条件(同时删除引号,从而禁用匹配):
还可以使用正则表达式匹配:
elif [[ "$1" = *.txt ]]
elif [[ "$1" =~ [.]txt$ ]]
请注意,您必须转义句点(或像我一样将其放在括号中),以防止禁用其特殊含义“任何字符”,并使用$
将正则表达式锚定到结尾,以便确保您匹配的是扩展名,而不是文件名中的子字符串
如果您想要不特定于bash的内容,可以尝试:
elif [ "${1##*.}" = txt ]
“${1###*.}”
扩展将删除从名为1的变量开始(可以是任何变量)并以句点结束的最长字符串,只保留扩展名。您还可以使用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
您还可以使用
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
在bash中,您当然可以使用正则表达式匹配(例如[$1=~\.txt]])或变量替换(例如[${1%*.}=txt]])。不确定这是否适用于sh。几乎可以肯定的是,如果不是单引号,*将被扩展…@setempler谢谢。我真的要把标签改成sh。我甚至没想过。在bash中,你当然可以使用正则表达式匹配(例如[$1=~\.txt]])或变量替换(例如[${1%*.}=txt]])。不确定这是否适用于sh。几乎可以肯定的是,如果不是单引号,*将被扩展…@setempler谢谢。我真的要把标签改成sh。我甚至没想过。很好,但是标签是用于
sh
,而不是bash
@clearlight除非我弄错了,否则上一个建议应该是符合POSIX的。很好,但是标签是用于sh
,不是bash
@clearlight除非我弄错了,否则最后一个提案应该是符合POSIX的。