Bash getopts:读取可选标志的$OPTARG?

前端之家收集整理的这篇文章主要介绍了Bash getopts:读取可选标志的$OPTARG?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我希望能够在我的脚本中接受强制和可选标志.这是我到目前为止.
  1. #!bin/bash
  2.  
  3. while getopts ":a:b:cdef" opt; do
  4. case $opt in
  5. a ) APPLE="$OPTARG";;
  6. b ) BANANA="$OPTARG";;
  7. c ) CHERRY="$OPTARG";;
  8. d ) DFRUIT="$OPTARG";;
  9. e ) EGGPLANT="$OPTARG";;
  10. f ) FIG="$OPTARG";;
  11. \?) echo "Invalid option: -"$OPTARG"" >&2
  12. exit 1;;
  13. : ) echo "Option -"$OPTARG" requires an argument." >&2
  14. exit 1;;
  15. esac
  16. done
  17. echo "Apple is "$APPLE""
  18. echo "Banana is "$BANANA""
  19. echo "Cherry is "$CHERRY""
  20. echo "Dfruit is "$DFRUIT""
  21. echo "Eggplant is "$EGGPLANT""
  22. echo "Fig is "$FIG""

但是,输出如下:

  1. bash script.sh -a apple -b banana -c cherry -d dfruit -e eggplant -f fig

输出

  1. Apple is apple
  2. Banana is banana
  3. Cherry is
  4. Dfruit is
  5. Eggplant is
  6. Fig is

你可以看到,可选标志并没有使用$OPTARG牵引参数,因为它与所需的标志一样.有没有办法读取$OPTARG在可选标志,而不会摆脱整洁的“:)”错误处理?

=======================================

编辑:我按照吉尔伯特的建议,清理下来.这是我做的:

  1. #!/bin/bash
  2.  
  3. if [[ "$1" =~ ^((-{1,2})([Hh]$|[Hh][Ee][Ll][Pp])|)$]]; then
  4. print_usage; exit 1
  5. else
  6. while [[ $# -gt 0 ]]; do
  7. opt="$1"
  8. shift;
  9. current_arg="$1"
  10. if [[ "$current_arg" =~ ^-{1,2}.* ]]; then
  11. echo "WARNING: You may have left an argument blank. Double check your command."
  12. fi
  13. case "$opt" in
  14. "-a"|"--apple" ) APPLE="$1"; shift;;
  15. "-b"|"--banana" ) BANANA="$1"; shift;;
  16. "-c"|"--cherry" ) CHERRY="$1"; shift;;
  17. "-d"|"--dfruit" ) DFRUIT="$1"; shift;;
  18. "-e"|"--eggplant" ) EGGPLANT="$1"; shift;;
  19. "-f"|"--fig" ) FIG="$1"; shift;;
  20. * ) echo "ERROR: Invalid option: \""$opt"\"" >&2
  21. exit 1;;
  22. esac
  23. done
  24. fi
  25.  
  26. if [[ "$APPLE" == "" || "$BANANA" == "" ]]; then
  27. echo "ERROR: Options -a and -b require arguments." >&2
  28. exit 1
  29. fi

非常感谢大家.到目前为止这完美无瑕.

大多数shell getopts一直在烦恼我很长时间,包括缺乏可选参数的支持.

但是,如果您愿意使用“–posix”样式参数,请访问bash argument case for args in $@

猜你在找的Bash相关文章