检查正确数量的参数


147

我如何检查正确数量的参数(一个参数)。如果有人尝试调用脚本而不传递正确数量的参数,并检查以确保命令行参数确实存在并且是目录。


5
@Daniel的shell意思是/bin/sh
Ruel

Answers:


215
#!/bin/sh
if [ "$#" -ne 1 ] || ! [ -d "$1" ]; then
  echo "Usage: $0 DIRECTORY" >&2
  exit 1
fi

转换:如果参数数目(从数字上)不等于1,或者第一个参数不是目录,则将用法输出到stderr并以失败状态代码退出。

更友好的错误报告:

#!/bin/sh
if [ "$#" -ne 1 ]; then
  echo "Usage: $0 DIRECTORY" >&2
  exit 1
fi
if ! [ -e "$1" ]; then
  echo "$1 not found" >&2
  exit 1
fi
if ! [ -d "$1" ]; then
  echo "$1 not a directory" >&2
  exit 1
fi

1
@Andrew K:它在哪一行报告?如果是“ if”行,请尝试删去使它成为其中之一的两个子句之一,if [ "$#" -ne 1 ] ; then或者if ! [ -d "$1" ]; then查看引起问题的子句。
劳伦斯·贡萨尔维斯

我想通了,谢谢。如果文件名不存在怎么办?
安德鲁K 2010年

就存在而言,不存在==不是董事-d。如果您想添加单独的支票,则可以-e用来检查是否存在。
劳伦斯·贡萨尔维斯

如果[-e“ $ 1”]然后回显“ $ 1:没有这样的目录”退出1 fi
Andrew K 2010年

@Andrew K:您想倒转支票。-e如果文件存在,则返回true。我在答案中添加了更友好的错误报告。
劳伦斯·贡萨尔维斯

22

猫script.sh

    var1=$1
    var2=$2
    if [ "$#" -eq 2 ]
    then
            if [ -d $var1 ]
            then
            echo directory ${var1} exist
            else
            echo Directory ${var1} Does not exists
            fi
            if [ -d $var2 ]
            then
            echo directory ${var2} exist
            else
            echo Directory ${var2} Does not exists
            fi
    else
    echo "Arguments are not equals to 2"
    exit 1
    fi

如下执行它-

./script.sh directory1 directory2

输出将像-

directory1 exit
directory2 Does not exists

14

您可以使用$#检查在命令行中传递的参数总数 。例如,我的s​​hell脚本名称是hello.sh

sh hello.sh hello-world
# I am passing hello-world as argument in command line which will b considered as 1 argument 
if [ $# -eq 1 ] 
then
    echo $1
else
    echo "invalid argument please pass only one argument "
fi

输出将是 hello-world

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.