使用bash中CASE语句中的命令参数 [英] Consume command args in a case statement in bash
本文介绍了使用bash中CASE语句中的命令参数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有一个CASE语句,它包含我的命令的一部分,我希望它遍历所有参数,直到它们都被使用完。
while [ ! -z ${@:2} ] ; do
case "${@:2}" in
-d|--delete*)
YES_DELETE=1
shift
;;
-nd|--nodelete*)
NO_DELETE=1
shift
;;
-y|--yes*)
SKIP_PROMPT=1
shift
;;
-*|*)
echo "Bad command, try again."
;;
esac
done
我的命令$@
是$ mpip stt=12 -nd -y
,这使得${@:2}="-nd -y"
。
如果它也像我希望的那样工作,那么它将在迭代两次之后退出While循环,NO_DELETE=1 SKIP_PROMPT=1
将为true。当我运行它时,一切仍未初始化,它变成一个无限循环,我不知道我做错了什么。
推荐答案
不要尝试绕过位置参数,而是将它们弹出。这将使您的逻辑更加简单,并且您的命令行界面更加用户友好(因为在这种情况下,位置参数可以跟在选项后面,这实际上是用于命令行解析的POSIX标准公式--实际上,POSIX工具根本不需要允许选项跟在位置参数后面,尽管GNU工具通常这样做作为扩展)。
#!/bin/bash
# ^^^^- IMPORTANT: Not /bin/sh
args=( ) # positional arguments
# completely empty the argv, shifting positional options into "${args[@]}" and processing
# option flags.
while (( $# )); do
case $1 in
-d) yes_delete=1 ;;
-nd) no_delete=1 ;;
-y) skip_prompt=1 ;;
-*) echo "Bad option" >&2; exit 1 ;;
--) shift; args+=( "$@" ); set -- ;;
*) args+=( "$1" ) ;;
esac
shift
done
# with options popped off, make our positional arguments the whole argument list
set -- "${args[@]}"
# examples of positional argument validation
(( "$#" )) || { echo "Error: At least one argument is required" >&2; exit 1; }
[[ $1 != *=* ]] || { echo "Error: First argument must contain an = sign" >&2; exit 1; }
这篇关于使用bash中CASE语句中的命令参数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文