Shell脚本中Case语句的动态模式

时间:2013-07-03 16:01:09

标签: shell

下面的代码只是我想要做的大致概述。在评估每个案例后,不要担心代码在做什么。

我的问题是,*','* )我试图识别用逗号分隔的文件的动态模式。

Ex: getfile.sh -fileextension file1,file2,file3,file4 将是我的输入。我如何认识到来自$ 2的输入(这等于var2)遵循*','*模式,其中*代表文件?

    if [ $flag -eq 1 ]; then
            case $var2 in
                #lists files if option is selected
                list | l | LIST | L | ls | LS)      do stuff here
                all | a | ALL | A)                  do stuff here
                *','* )                             do stuff here
                * )                                 do stuff here
            esac
        fi

我应该补充一点,程序应该根据它们的扩展名列出一组文件,然后允许用户获取所有这些文件,或者选择mutliple(或单个)文件。因为我不知道用户要输入什么,我试图匹配模式而不是静态输入。


所以这就是我的新代码的样子,并且更接近我想要实现的目标:

让我们专注于案件,以免混淆。

case $var2 in
        #lists files if option is selected
        list | l | LIST | L | ls | LS)      ls -1 $DIRECTORY*$extension
                        exit
                        ;;
        #copy all files in the directory
        all | a | ALL | A)  
                        echo ">Cleaning temp dir"
                        allcheck=1
                        cleantemp   
                        copy
                        zip
                        exit
                        ;;
        [0-9][0-9a-zA-Z] | [0-9]','[0-9a-zA-Z]) echo "this is valid input"
                        exit
                        ;;
        * )             
                        echo ">>Bad argument"
                        #help
                        exit 1
                        #fi
    esac

这是我想要匹配的模式

[0-9]','[0-9a-zA-Z]

我找到一个给我一个线索的链接后想出来了: How do I test if a variable is a number in Bash?

无论如何,这是我最终的结果:

case $var2 in
        #lists files if option is selected
        list | l | LIST | L | ls | LS)      ls -1 $DIRECTORY*$extension
                        exit
                        ;;
        #copy all files in the directory
        all | a | ALL | A)  
                        echo ">Cleaning temp dir"
                        allcheck=1
                        cleantemp   
                        copy
                        zip
                        exit
                        ;;
        [0-9][0-9a-zA-Z] | [0-9][0-9a-zA-Z],[0-9][0-9a-zA-Z],*) echo "this is valid input"
                        exit
                        ;;
        * )             
                        echo ">>Bad argument"
                        #help
                        exit 1
                        #fi
    esac

此测试适用于输入,如56或5A [0-9][0-9a-zA-Z] 此测试用于输入,用逗号分隔,例如我尝试完成的操作。 [0-9][0-9a-zA-Z],[0-9][0-9a-zA-Z],*

(我仍然需要确保没有输入无效字符,但是,它确实减少了我现在必须做的工作。)

感谢您试图帮助“另一个人”。

1 个答案:

答案 0 :(得分:0)

您的代码正确匹配包含逗号的var2值:

flag=1
var2="file1,file2,file3,file4"
if [ $flag -eq 1 ]; then
    case $var2 in
        #lists files if option is selected
        list | l | LIST | L | ls | LS)      stuff here ;;
        all | a | ALL | A)                  stuff here ;;
        *','* )                             echo "It works" ;;
        * )                                 stuff here ;;
    esac
fi

将打印“It works”。

如果问题是如何分隔逗号分隔列表,则可以使用

IFS=","
for file in $var2
do
    echo "Processing $file"
done