检查bash中字符串中的子字符串

时间:2013-08-20 21:28:51

标签: linux bash

我需要一个句子,如果... else ..验证是否在bash中指定了字符串的文件名

for j in `ls `
do
    if [ "${j:(-3)}" == ".gz" ]; then
        Cmd="zcat"
    elif [ "${j:(-4)}" == ".bz2" ]; then
        Cmd="bzcat"
    else
        Cmd="cat"
    fi

    if [ $j ***contains*** "string1"]; then
        $cmd $j | awk -F"," '{print $4}' 
    elif [ $j  *contains*  "string2" ]; then 
        $cmd $j | awk -F"," '{print $2}'
    fi

done

3 个答案:

答案 0 :(得分:8)

使用支持通配符的双括号:

if [[ $j == *string1* ]]; then

另外,don't parse ls;改为使用glob:

而不是

for j in `ls `

使用

for j in *

如果您不希望匹配不区分大小写,可以设置shopt -s nocasematch选项:

shopt -s nocasematch
if [[ $j == *string1* ]]; then

答案 1 :(得分:2)

=〜运算符可以满足您的需求。

我个人会使用find和xargs。

find . -name "*.gz" -print0 | xargs -I{} -0 gzip -dc {} | cut -f, -d4
find . -name "*.bz2" -print0 | xargs -I{} -0 bzip2 -dc {} | cut -f, -d4

答案 2 :(得分:1)

在这里使用bash的正则表达式功能。所以而不是;

if [ $j ***contains*** "string1"]; then

使用:

if [[ "$j" =~ \bstring1\b ]]; then

PS:请注意使用\b (字边界),以确保您与string123中的$j不匹配

而不是使用ls

for j in `ls `

你应该更好地使用:

for j in *