如何将测试操作符从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
语句If
sh
fish
中的regex可以使用

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

你似乎把
csh
的语法和
sh
的语法弄混了。它们是两种不同的语言。@triplee,你的意思是什么,我对你的评论有点困惑?
sh
中的模式匹配不起作用,所以你可以使用
grep
。你在哪里看到
sh
中的
csh
?括号中的around
echo$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
中。