【问题标题】:How to detect a filename within a case statement - in unix shell?如何在 case 语句中检测文件名 - 在 unix shell 中?
【发布时间】:2009-11-30 00:31:43
【问题描述】:

我编写了以下代码,如果没有 -l 或 -L 选项传递给脚本,我需要假设(检测)文件名是否作为参数传递。仅当文件名是一个小写字符时,以下第三个条件才匹配。如何灵活匹配大小写字母或可变长度的字符串?

while [ $# -gt 0 ]
    do

        case $1 in
            -l)     echo ls;;
            -L)     echo ls -l;;
            [a-z])  echo filename;;
            *)  echo usage
                exit 1;;
        esac

        shift
    done

另外,我怎样才能在那个 case 语句中包含一个对空 $1 做出反应的条件? 例如,如果在没有任何选项或文件名的情况下调用脚本。

【问题讨论】:

    标签: shell unix


    【解决方案1】:

    您可以将空字符串与'')"") 大小写匹配。

    文件名可以包含任何字符——甚至是奇怪的字符,比如符号、空格、换行符和控制字符——所以试图通过查找字母和数字来确定你是否有文件名不是正确的方法去做吧。相反,您可以使用[ -e filename ] 测试来检查字符串是否是有效的文件名。

    顺便说一句,您应该将"$1" 放在双引号中,这样如果文件名确实包含空格,您的脚本就可以工作。

    case "$1" in
        '')     echo empty;;
        -l)     echo ls;;
        -L)     echo ls -l;;
        *)      if [ -e "$1" ]; then
                    echo filename
                else
                    echo usage >&2  # echo to stderr
                    exit 1
                fi;;
    esac
    

    【讨论】:

    • "检查一个字符串是否是一个有效的文件名" - 实际上它检查文件是否存在(就像-e一样)
    • 那么-e和-f有什么区别呢?
    • 参见man bash:-e 检查文件是否存在,-f 检查文件是否也是文件(不是目录)
    【解决方案2】:

    使用getopts 解析选项,然后根据需要处理剩余的非选项参数(例如通过测试它们是否为文件)。

    【讨论】:

      【解决方案3】:

      如果您在不带引号的情况下搜索“模式匹配”,您会在 bash 手册页中找到信息。这可以解决问题:[a-zA-Z0-9]*) 您可能应该继续阅读有关模式匹配、正则表达式等的内容。 此外,您应该尊重 john kugelmans 关于双引号的提示。 在下面的代码 sn-p 中,您可以看到如何检查是否没有传递任何参数。

      #!/bin/sh
      
      case "$1" in
          [a-zA-Z0-9]*)
              echo "filename"
          ;;
          "")
              echo "no data"
          ;;
      
      esac
      

      【讨论】:

        【解决方案4】:

        @OP,通常如果您使用 bash,为了匹配不区分大小写,您可以使用 shopt 并设置 nocasematch

        $ shopt -s nocasematch
        

        在你的case语句中检查null

        case "$var" in
          "") echo "empty value";;
        esac
        

        【讨论】:

          【解决方案5】:

          最好不要使用默认情况 *) 并且至少可以使用 [ -e "$1" ] 检查文件是否存在 ...如果不存在,则回显使用情况并退出 1。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-05-01
            • 1970-01-01
            • 1970-01-01
            • 2017-08-06
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多