如何将测试运算符从 bash 转换为 sh



>我在bash中有下一个字符串比较:

if [[ $1 == "/"* ]]; then echo YES; else echo "$1"; fi

如何在sh中做同样的事情?

你可以

用一个case语句来做到这一点。

case $1 in
    /*) echo YES;;
    *)  echo $1
esac

直接翻译将是if [ "$1" = "/*" ],但它不起作用,因为 sh 不支持那里的 glob 匹配。您需要调用像 grep 这样的外部命令。

if printf '%sn' "$1" | grep -e '^/' >/dev/null 2>&1; then
    ...
fi

使用grep -q这会更短,但如果你没有 bash,那么你也可能没有grep -q

case语句可以优雅地处理这个问题。

case $1 in 
 '/'* ) echo YES;;
 *) echo "$1";;
esac

in前缺少引号以及双分号和不成对右括号的一般语法对新手来说很不舒服,但你很快就会习惯它。 它用途广泛,但被低估了。

如果你坚持使用[你也许可以做类似的事情

if temp=${1#?}; [ "${1%$temp}" -eq '*' ]; then
    ...

它使用几个参数扩展来提取变量的第一个字符;但是case内置了 glob 模式匹配,因此它的可读性要高得多。

如果您想

匹配模式或if语句中的正则表达式,如果shfish您可以使用

if echo "$1" | grep -q ^/; then echo yes; else echo "$1"; fi

最新更新