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的。