为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

摇曳的蔷薇 2019-09-18 11:05:26
我想检查字符串是否以“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怎么做正确?
查看完整描述

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,所以必须使用字符串。但是用字符串嵌套函数调用是不可能的,管道是不可能的......)


查看完整回答
反对 回复 2019-09-18
  • 3 回答
  • 0 关注
  • 1414 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信