3 回答
TA贡献1906条经验 获得超10个赞
我总是试图坚持使用POSIX sh而不是使用bash扩展,因为脚本的一个主要点是可移植性。(除了连接程序,不替换它们)
在sh中,有一种简单的方法来检查“is-prefix”条件。
case $HOST in node*)
your code here
esac
考虑到多大年龄,神秘和苛刻的sh(并且bash不是治愈:它更复杂,更不一致,更不便携),我想指出一个非常好的功能方面:虽然一些语法元素case是内置的,结果构造与任何其他工作没有什么不同。它们可以以相同的方式组成:
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,所以必须使用字符串。但是用字符串嵌套函数调用是不可能的,管道是不可能的......)
- 3 回答
- 0 关注
- 1414 浏览
添加回答
举报