3

我需要一个句子 if...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
4

3 回答 3

8

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

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

另外,不要解析 ls;改用 glob:

代替

for j in `ls `

利用

for j in *

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

shopt -s nocasematch
if [[ $j == *string1* ]]; then
于 2013-08-20T21:36:57.850 回答
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
于 2013-08-20T21:40:53.893 回答
1

在此处使用 bash 的正则表达式功能。所以代替;

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

利用:

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

PS:注意使用\b (单词边界)以确保您不匹配string123.$j

也代替使用ls

for j in `ls `

你应该更好地使用:

for j in *
于 2013-08-20T21:37:31.113 回答