我总是尝试坚持使用 POSIX sh 而不是使用 Bash 扩展,因为脚本编写的要点之一是可移植性(除了连接程序,而不是替换它们)。
在sh 中,有一种简单的方法可以检查“is-prefix”条件。
case $HOST in node*)
# Your code here
esac
考虑到 sh 有多古老、晦涩难懂(而且 Bash 不是灵丹妙药:它更复杂、更不一致且更不便携),我想指出一个非常好的功能方面:虽然一些语法元素,如 @ 987654324@ 是内置的,生成的构造与任何其他工作没有什么不同。它们可以以相同的方式组合:
if case $HOST in node*) true;; *) false;; esac; then
# Your code here
fi
甚至更短
if case $HOST in node*) ;; *) false;; esac; then
# Your code here
fi
或者甚至更短(只是为了将!作为语言元素呈现——但现在这种风格很糟糕)
if ! case $HOST in node*) false;; esac; then
# Your code here
fi
如果您喜欢明确表达,请构建自己的语言元素:
beginswith() { case $2 in "$1"*) true;; *) false;; esac; }
这真的不是很好吗?
if beginswith node "$HOST"; then
# Your code here
fi
由于sh 基本上只是作业和字符串列表(以及内部进程,作业由这些组成),我们现在甚至可以进行一些简单的函数式编程:
beginswith() { case $2 in "$1"*) true;; *) false;; esac; }
checkresult() { if [ $? = 0 ]; then echo TRUE; else echo FALSE; fi; }
all() {
test=$1; shift
for i in "$@"; do
$test "$i" || return
done
}
all "beginswith x" x xy xyz ; checkresult # Prints TRUE
all "beginswith x" x xy abc ; checkresult # Prints FALSE
这很优雅。并不是说我会提倡将sh 用于任何严重的事情——它在现实世界的要求上太快了(没有lambda,所以我们必须使用字符串。但是用字符串嵌套函数调用是不可能的,管道是不可能的,等等.)