【问题标题】:check the order & validate arguments to shell script检查命令并验证 shell 脚本的参数
【发布时间】:2013-01-02 01:54:48
【问题描述】:

我知道类似的问题可能会被问到,但我是 shell 脚本的新手,没有找到帮助(可能是我无法理解技术细节)。我有一个简单的问题:

我有一个简单的脚本 (testscript.sh),它需要 3 个参数,我使用三个参数传递这些参数并运行它:(第一个参数是一个简单的字符串,第二个是文件名的路径,第三个是一个文件夹名字)

./testscript.sh --para1 "somestring" --para2 "/home/android/test/abc.xml" --para3 "/home/android/outputfolder"

现在我想检查用户是否提供了所有带有正确参数的 reqd 输入值。我的意思是 para3 必须包含文件夹名称,para2 必须是文件名 & para1 必须是字符串,或者它们以相同的顺序出现。

我还想验证一件事:目前我希望用户输入文件名“/home/android/test/abc.xml”,用双引号括起来,但如果用户没有用双引号括起来&文件夹/文件名中有一个空格,它会产生问题,因为我无法获得包括空格在内的完整文件/文件夹名称,它正在破坏。

请帮忙。谢谢

【问题讨论】:

    标签: validation shell arguments command-line-arguments optional-arguments


    【解决方案1】:

    这应该可以工作

    #!/bin/sh
    
    usage ()
    {
      echo "usage: $0 STRING FILE DIRECTORY"
      exit
    }
    
    [ -n "$1" ] || usage
    [ -e "$2" ] || usage
    [ -d "$3" ] || usage
    

    ref

    【讨论】:

    • 感谢这个 svnpenn,通过这个我可以检查 $2、$4 和 $6 是否是字符串、文件和文件夹,但是有没有办法可以检查“--para1”的值是字符串, “--para2” 是文件&& “--para1” 是文件夹?
    【解决方案2】:

    不能完全符合我的要求,但可以这样工作:修改脚本运行方式:

    ./testscript.sh -p "somestring" -i "/home/android/test/abc.xml" -o "/home/android/outputfolder"
    

    & 在脚本中添加了如下检查:

    while getopts ":p:i:o:" opt; do
      case $opt in
        p)
          if [ "$OPTARG" = "abc" ] || [ "$OPTARG" = "xyz" ]; then
            somestring=$OPTARG
          else
            echo "Invalid parameter" >&2
            usage
          fi
          ;;
        i)
          if [ -e $OPTARG ] && [ -f $OPTARG ]; then 
        input=$OPTARG
           else
            echo "Input file doest'nt exist " >&2
            usage
          fi
          ;;
        o)
          if [ -e $OPTARG ]; then
        ouput=$OPTARG
          else
            echo "Output folder doest'nt exist " >&2
            usage
          fi
          ;;
        \?)
          echo "Invalid option: -$OPTARG" >&2
          exit 1
          ;;
        :)
          echo "Option -$OPTARG requires an argument." >&2
          exit 1
          ;;
      esac
    done
    

    但是仍然有人找到我的问题的确切解决方案(使用“--para1”),欢迎回答!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-03
      • 1970-01-01
      • 2015-07-16
      • 2016-04-02
      • 1970-01-01
      • 1970-01-01
      • 2021-02-04
      • 2014-04-03
      相关资源
      最近更新 更多