在bash中,如何检查字符串是否以某个值开头?

我想检查字符串是否以“node”开头,例如“node001”。就像是


if [ $HOST == user* ]  

  then  

  echo yes  

fi

我该怎么做才能正确?


我还需要组合表达式来检查HOST是“user1”还是以“node”开头


if [ [[ $HOST == user1 ]] -o [[ $HOST == node* ]] ];  

then  

echo yes 

fi


> > > -bash: [: too many arguments

怎么做正确?


摇曳的蔷薇
浏览 1440回答 3
3回答

隔江千里

我总是试图坚持使用POSIX sh而不是使用bash扩展,因为脚本的一个主要点是可移植性。(除了连接程序,不替换它们)在sh中,有一种简单的方法来检查“is-prefix”条件。case $HOST in node*)    your code hereesac考虑到多大年龄,神秘和苛刻的sh(并且bash不是治愈:它更复杂,更不一致,更不便携),我想指出一个非常好的功能方面:虽然一些语法元素case是内置的,结果构造与任何其他工作没有什么不同。它们可以以相同的方式组成:if case $HOST in node*) true;; *) false;; esac; then    your code herefi甚至更短if case $HOST in node*) ;; *) false;; esac; then    your code herefi或者甚至更短(只呈现!为一个语言元素-但是这是不好的风格现在)if ! case $HOST in node*) false;; esac; then    your code herefi如果您喜欢明确,请构建自己的语言元素:beginswith() { case $2 in "$1"*) true;; *) false;; esac; }这不是很好吗?if beginswith node "$HOST"; then    your code herefi由于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 TRUEall "beginswith x" x xy abc ; checkresult  # prints FALSE这很优雅。并不是说我会主张使用sh来处理任何严重的事情 - 它在现实世界的要求上打得太快(没有lambda,所以必须使用字符串。但是用字符串嵌套函数调用是不可能的,管道是不可能的......)
打开App,查看更多内容
随时随地看视频慕课网APP