0

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

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

例如: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

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


所以这就是我的新代码的样子,并且更接近我想要完成的任务:

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

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]

在找到一个给我线索的链接后,我想通了: 如何测试变量是否是 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],*

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

感谢您尝试帮助“其他人”。

4

1 回答 1

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

将打印“它有效”。

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

IFS=","
for file in $var2
do
    echo "Processing $file"
done
于 2013-07-03T17:14:53.307 回答