如何判断一个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