2009-11-30 74 views
0

我编码了下面的代码,如果没有-l或-L选项传递给脚本,我需要假设(检测)文件名是否作为参数传递。如果文件名是一个小写字符,下面的第三个条件只匹配。我怎样才能灵活地匹配大小写字母或可变长度的字符串?如何在case语句中检测文件名 - 在unix shell中?

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 

此外,如何包含一个条件,在这种情况下,将反应为空$ 1? 例如,如果脚本被调用时没有任何选项或文件名。

回答

2

您可以匹配空字符串与'')"")的情况。

文件名可以包含任何字符 - 即使是奇怪的字符都喜欢符号,空格,换行符和控制字符 - 所以试图通过查找字母和数字来确定文件名是否正确方法来做到这一点。相反,您可以使用[ -e filename ]测试来检查字符串是否是有效的文件名。

顺便说一句,您应该用加双引号,这样如果文件名中包含空格,您的脚本就可以工作。

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 
+0

“检查一个字符串是否是一个有效的文件名” - 实际上它检查文件是否存在(如'-e') – 2009-11-30 01:31:37

+0

-e和-f之间有什么区别? – goe 2009-11-30 02:01:34

+0

请参阅'man bash':-e检查文件是否存在,-f检查它是否也是文件(不是目录) – 2009-11-30 02:13:09

1

使用getopts解析选项,然后把余下的非选项参数,只要你喜欢(如通过测试,如果他们的文件)。

0

如果您在不带引号的情况下搜索“模式匹配”,则可以在bash手册页中找到相关信息。这个技巧:[a-zA-Z0-9] *) 您应该阅读关于模式匹配,正则表达式等等。此外,您应该尊重John Kugelmans对双引号的暗示。 在以下代码片段中,您可以看到如何检查是否没有参数传递。

#!/bin/sh 

case "$1" in 
    [a-zA-Z0-9]*) 
     echo "filename" 
    ;; 
    "") 
     echo "no data" 
    ;; 

esac 
0

@OP,总的来说,如果你正在使用bash,匹配不区分大小写,您可以使用禁用了javascript,并设置nocasematch

$ shopt -s nocasematch 

在你的case语句来检查空

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

你最好是落入默认情况下*),并且您至少可以检查文件是否存在[-e“$ 1”] ...如果不存在,则回显用法并退出1.