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-03-19 13:46:17 浏览: 45
这是一个典型的 shell 脚本中的命令行参数解析器,可以解析传递给脚本的参数。具体来说,该脚本通过一个 while 循环来读取每一个传递给脚本的参数,然后根据参数的不同选项执行不同的操作,解析出相应的选项和参数值,并将其赋值给相应的变量。
以下是该脚本的解析流程:
1. 使用一个 `while` 循环来读取每个传递给脚本的参数,如果没有参数则退出循环。
2. 使用 `case` 语句对参数进行分类,根据参数的不同选项执行不同的操作。
3. 对于 `--help` 或 `-h` 选项,如果 `help_message` 变量没有被定义,则输出错误信息并退出脚本;否则输出 `help_message` 的值并退出脚本。
4. 对于 `--*=*` 选项,如果参数不符合 `--name value` 的格式,则输出错误信息并退出脚本。
5. 对于以 `--` 开头的选项,将选项名转换为变量名,并检查该变量是否已定义。如果未定义,则输出错误信息并退出脚本;否则将该变量赋值为参数值。如果该变量之前的值为 `true` 或 `false`,则检查参数值是否为 `true` 或 `false`,如果不是则输出错误信息并退出脚本。
6. 对于其他参数,跳出循环并停止解析。
将该脚本转换为 Python 代码比较繁琐,因为需要手动模拟每个操作。以下是一个大致的 Python 版本的示例代码:
```python
import sys
i = 1
while i <= len(sys.argv) - 1:
arg = sys.argv[i]
if arg in ["--help", "-h"]:
if not help_message:
sys.stderr.write("No help found.\n")
sys.exit(0)
else:
sys.stderr.write(help_message + "\n")
sys.exit(0)
elif arg.startswith("--"):
name = arg[2:].replace("-", "_")
if name not in locals() and name not in globals():
sys.stderr.write(f"{sys.argv[0]}: invalid option {arg}\n")
sys.exit(1)
oldval = locals().get(name, globals().get(name))
if oldval in [True, False]:
if len(sys.argv) <= i + 1:
sys.stderr.write(f"{sys.argv[0]}: expected 'true' or 'false': {arg}\n")
sys.exit(1)
newval = True if sys.argv[i + 1] == "true" else False if sys.argv[i + 1] == "false" else None
if newval is None:
sys.stderr.write(f"{sys.argv[0]}: expected 'true' or 'false': {arg}\n")
sys.exit(1)
locals()[name] = newval
i += 2
else:
locals()[name] = True
i += 1
elif arg.startswith("-"):
sys.stderr.write(f"{sys.argv[0]}: invalid option {arg}\n")
sys.exit(1)
else:
break
```
需要注意的是,在 Python 中,由于变量作用域的限制,需要分别检查局部变量和全局变量中是否存在指定的变量名。此外,由于 Python 中没有类似于 `eval` 的函数,因此需要手动获取和设置变量的值。
阅读全文