while true; do [ -z "${1:-}" ] && break; case "$1" in --help|-h) if [ -z "$help_message" ]; then echo "No help found." 1>&2; else printf "$help_message\n" 1>&2 ; fi; exit 0 ;; --*=*) echo "$0: options to scripts must be of the form --name value, got '$1'" exit 1 ;; --*) name=`echo "$1" | sed s/^--// | sed s/-/_/g`; eval '[ -z "${'$name'+xxx}" ]' && echo "$0: invalid option $1" 1>&2 && exit 1; oldval="`eval echo \\$$name`"; if [ "$oldval" == "true" ] || [ "$oldval" == "false" ]; then was_bool=true; else was_bool=false; fi eval $name=\"$2\"; if $was_bool && [[ "$2" != "true" && "$2" != "false" ]]; then echo "$0: expected \"true\" or \"false\": $1 $2" 1>&2 exit 1; fi shift 2; ;; *) break; esac done是什么意思
时间: 2024-04-05 21:31:15 浏览: 98
FlexGraphics_V_1.79_D4-XE10.2_Downloadly.ir
4星 · 用户满意度95%
这是一个 Bash 脚本中的 while 循环语句,用于解析命令行参数。循环体内部的语句用于检查每个参数的合法性,并将其解析为对应的变量,以便后续使用。具体来说:
- 第一行的 while true; do 表示无限循环。
- [ -z "${1:-}" ] && break; 表示如果当前参数为空($1 表示第一个参数),则跳出循环。
- case "$1" in 表示对当前参数进行匹配。
- --help|-h) if [ -z "$help_message" ]; then echo "No help found." 1>&2; else printf "$help_message\n" 1>&2 ; fi; exit 0 ;; 表示如果当前参数是 --help 或 -h,则输出帮助信息并退出脚本。
- --*=*) echo "$0: options to scripts must be of the form --name value, got '$1'" exit 1 ;; 表示如果当前参数的格式不正确,则输出错误信息并退出脚本。
- --*) name=`echo "$1" | sed s/^--// | sed s/-/_/g`; eval '[ -z "${'$name'+xxx}" ]' && echo "$0: invalid option $1" 1>&2 && exit 1; oldval="`eval echo \\$$name`"; if [ "$oldval" == "true" ] || [ "$oldval" == "false" ]; then was_bool=true; else was_bool=false; fi eval $name=\"$2\"; if $was_bool && [[ "$2" != "true" && "$2" != "false" ]]; then echo "$0: expected \"true\" or \"false\": $1 $2" 1>&2 exit 1; fi shift 2; ;; 表示如果当前参数以 -- 开头,则将其解析为对应的变量名,并将下一个参数作为变量值进行赋值。如果原来的变量值是 true 或 false,则检查新的值是否合法。最后将参数指针向后移动两个位置。
- *) break; 表示如果当前参数不匹配任何模式,则跳出循环。
- 最后一个 done 表示循环结束。
阅读全文