如何将测试操作符从bash转换为sh?
我在如何将测试操作符从bash转换为sh?,bash,sh,Bash,Sh,我在bash中有下一个字符串比较: if [[ $1 == "/"* ]]; then echo YES; else echo "$1"; fi 如何在sh中执行相同的操作?您可以使用case语句执行此操作 case $1 in /*) echo YES;; *) echo $1 esac 如果[“$1”=“/*”],则直接翻译为,但它不起作用,因为sh不支持glob匹配。您需要调用外部命令,如grep if printf '%s\n' "$1" | grep -e '^/
bash
中有下一个字符串比较:
if [[ $1 == "/"* ]]; then echo YES; else echo "$1"; fi
如何在
sh
中执行相同的操作?您可以使用case
语句执行此操作
case $1 in
/*) echo YES;;
*) echo $1
esac
如果[“$1”=“/*”],则直接翻译为,但它不起作用,因为sh不支持glob匹配。您需要调用外部命令,如grep
if printf '%s\n' "$1" | grep -e '^/' >/dev/null 2>&1; then
...
fi
如果使用grep-q
,这会更短,但是如果没有bash,那么也可能没有grep-q
。case
语句可以优雅地处理这个问题
case $1 in
'/'* ) echo YES;;
*) echo "$1";;
esac
在中,在之前没有引用,以及使用双分号和不成对右括号的一般语法,这对新手来说是不和谐的,但您很快就会习惯它。它的用途相当广泛,而且被低估了很多
如果你坚持使用[
,你也许可以这样做
if temp=${1#?}; [ "${1%$temp}" -eq '*' ]; then
...
它使用两个参数扩展来提取变量的第一个字符;但是case
内置了glob模式匹配,因此可读性更高。如果要匹配模式,或者If
语句Ifsh
或fish
中的regex可以使用
if echo "$1" | grep -q ^/; then echo yes; else echo "$1"; fi
你似乎把csh
的语法和sh
的语法弄混了。它们是两种不同的语言。@triplee,你的意思是什么,我对你的评论有点困惑?sh
中的模式匹配不起作用,所以你可以使用grep
。你在哪里看到sh
中的csh
?括号中的aroundecho$1 | grep
在这里创建一个不必要且低效的子shell。在csh
中,您实际上在这个位置使用了括号,但是在这里,如果echo$1 | grep-Eq/.*>,
也可以工作……或者实际上同样糟糕;您仍然有一个引用错误和一个不必要的-E
以及错误的正则表达式(但是,如果echo“$1”| grep-q'^/';那么如果你坚持使用外部进程来完成shell不需要外部进程就可以完成的事情,那么试试。@tripleee,我已经检查了你说的话……令人惊讶的是……你是对的;)。我已经按照您的建议进行了更新。我确实同意此解决方案并没有那么好,但是如果您需要if
语句,那么它具有很好的可读性。尽管如此,案例
解决方案更为优雅。@triplee并再次修复了引号。@tripleee:fixedIMO,我们应该能够假设POSIX兼容工具(-q
由POSIX指定),并让OP询问不符合要求的工具。expr“$1”:“/.*”
将是符合POSIX的替代方案,而不是将值管道化到grep
中。