如何检查参数是否合法?

时间:2015-04-19 14:25:24

标签: bash

我必须编写一个bash脚本来计算文本文件中的所有命令。脚本的参数是-p-n num和文件。这意味着命令如:

script.sh -n 3 -p file.txt
script -p -n 3 file.txt

和类似的都是合法的。

但是,我必须回复任何与此类似的命令的错误:例如script.sh -n -k file.txt

这是link to my code

我设法让它发挥作用,但这太冗长了。有没有办法可以在短时间内做到这一点?

2 个答案:

答案 0 :(得分:3)

您可能需要查看以下标准命令之一:

  • getopts是Bash内置的。它更新,更简单,但不支持长选项(--option)。
  • getopt是一个外部程序,可能涉及更多的胶水代码。有不同的实现。 getopt通常支持长选项。

这是一个很小的getopts示例(修改了此external site中的一个示例):

#!/bin/bash

flag=off
dir=

# iterate over each option with getopts:
while getopts fd: opt
do
    case "$opt" in
      f)  flag=on;;
      d)  dir="$OPTARG";;
      *)  echo >&2 "usage: $0 [-f] [-d directory] [file ...]"
      exit 1;;
    esac
done

# remove all positional pararmeters we already 
# handled from the command line:
shift $(( expr $OPTIND - 1 ))

# main part of your program, remaining arguments are now in
# $@ resp. $0, $1, ...

答案 1 :(得分:1)

我想建议另一个比你更简单易懂的片段,因为它完全描述了你在评论中指定的两个有效案例:

  

如果我想“调用”我的脚本,它必须如下所示:script.sh -n +number -p file.txtfile.txt必须是最后一个参数,但-n-p可以切换。

所以案例是($0$4):

  • script.sh -n +number -p file.txt
  • script.sh -p -n +number file.txt

它仅使用if和Bash的逻辑运算符:

#!/bin/bash

if ! { [[ "$1" = "-n" ]] && [[ "$2" =~ ^-[0-9]+$ ]] && [[ "$3" = "-p" ]] && [[ "$4" =~ ".txt"$ ]] ; } &&
   ! { [[ "$2" = "-n" ]] && [[ "$3" =~ ^-[0-9]+$ ]] && [[ "$1" = "-p" ]] && [[ "$4" =~ ".txt"$ ]] ; }
then
    echo "Error" && exit 1
fi

注意:

  • 小组({})语法在其列表末尾需要;
  • 您必须使用正则表达式来检查*.txt
  • 您提供的正则表达式编号需要以-开头,而在您的规范中,您需要+