如何判断一个string在Unix shell脚本中是否包含另一个string?

我想编写一个Unix shell脚本,如果在另一个string中有一个string,它将执行各种逻辑。 例如,如果我在某个文件夹中,则closures。 有人可以告诉我如何做到这一点? 如果可能的话,我想使这不是特定的(即不bash),但如果没有其他的办法,我可以做到这一点。

#!/usr/bin/env sh if [ "$PWD" contains "String1" ] then echo "String1 present" elif [ "$PWD" contains "String2" ] then echo "String2 present" else echo "Else" fi 

这是另一个解决scheme。 这使用POSIX子串参数扩展 ,所以它在bash,破折号,ksh …

 test "${string#*$word}" != "$string" && echo "$word found in $string" 

编辑:这是一个好主意,C.罗斯。 这是一个function化的版本,其中包含一些示例:

 # contains(string, substring) # # Returns 0 if the specified string contains the specified substring, # otherwise returns 1. contains() { string="$1" substring="$2" if test "${string#*$substring}" != "$string" then return 0 # $substring is in $string else return 1 # $substring is not in $string fi } contains "abcd" "e" || echo "abcd does not contain e" contains "abcd" "ab" && echo "abcd contains ab" contains "abcd" "bc" && echo "abcd contains bc" contains "abcd" "cd" && echo "abcd contains cd" contains "abcd" "abcd" && echo "abcd contains abcd" contains "" "" && echo "empty string contains empty string" contains "a" "" && echo "a contains empty string" contains "" "a" || echo "empty string does not contain a" contains "abcd efgh" "cd ef" && echo "abcd efgh contains cd ef" contains "abcd efgh" " " && echo "abcd efgh contains a space" 

纯POSIXshell:

 #!/bin/sh CURRENT_DIR=`pwd` case "$CURRENT_DIR" in *String1*) echo "String1 present" ;; *String2*) echo "String2 present" ;; *) echo "else" ;; esac 

像ksh或bash这样的扩展shell具有很好的匹配机制,但是旧式的case却非常强大。

可悲的是,我不知道有什么办法可以做到这一点。 但是,使用bash(从版本3.0.0开始,这可能是你所拥有的),你可以使用=〜运算符,如下所示:

 #!/bin/bash CURRENT_DIR=`pwd` if [[ "$CURRENT_DIR" =~ "String1" ]] then echo "String1 present" elif [[ "$CURRENT_DIR" =~ "String2" ]] then echo "String2 present" else echo "Else" fi 

作为一个额外的好处(和/或警告,如果你的string中有任何有趣的字符),=〜接受正则expression式作为右操作数,如果你省略引号。

 #!/usr/bin/env sh # Searches a subset string in a string: # 1st arg:reference string # 2nd arg:subset string to be matched if echo "$1" | grep -q "$2" then echo "$2 is in $1" else echo "$2 is not in $1" fi 
 case $(pwd) in *path) echo "ends with path";; path*) echo "starts with path";; *path*) echo "contains path";; *) echo "this is the default";; esac 

这里是你的问题的各种解决scheme的链接 。

这是我最喜欢的,因为它使人类可读性最高。

星型通配符方法

 if [[ "$string" == *"$substring"* ]]; then return 1 fi return 0 

有bash regexps 。 或者有'expr':

  if expr "$link" : '/.*' > /dev/null; then PRG="$link" else PRG=`dirname "$PRG"`/"$link" fi 

请参阅“testing”程序的联机帮助页。 如果你只是testing一个目录的存在,你通常会这样做:

 if test -d "String1"; then echo "String1 present" end 

如果你真的想匹配一个string,你也可以使用bash扩展规则和通配符:

 if test -d "String*"; then echo "A directory starting with 'String' is present" end 

如果你需要做更复杂的事情,你需要使用另一个程序,如expr。

在特殊情况下,如果要查找长文本中是否包含单词,可以使用循环遍历长文本。

 found=F query_word=this long_string="many many words in this text" for w in $long_string; do if [ "$w" = "$query_word" ]; then found=T break fi done 

这是纯Bourne壳。

如果你想要一个和“test”一样快的ksh方法,你可以做如下的事情:

 contains() # haystack needle { haystack=${1/$2/} if [ ${#haystack} -ne ${#1} ] ; then return 1 fi return 0 } 

它通过删除干草堆中的针,然后比较新旧干草堆的长度。

 test $(echo "stringcontain" "ingcon" |awk '{ print index($1, $2) }') -gt 0 && echo "String 1 contain string 2" 

– >输出:string1包含string2