>我在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
语句中的正则表达式,如果sh
或fish
您可以使用
if echo "$1" | grep -q ^/; then echo yes; else echo "$1"; fi