理解shell中set -- "$@" "-h"命令的作用与长选项替换逻辑
Shell
set --命令与长选项转短选项逻辑说明 核心命令set -- "$@" "-h"的作用
你之前的理解是正确的,这行命令的作用就是将-h追加到当前脚本/函数的位置参数列表末尾,各部分含义如下:
--是set命令的选项终止符,作用是告知set后面的所有内容都会被当作位置参数处理,哪怕参数以-开头也不会被识别为set自身的选项,避免参数解析错误。"$@"代表当前所有的原始位置参数,会保留每个参数的原始边界,不会因为包含空格被拆分为多个参数。- 整行命令会先保留所有原有参数,再在末尾追加
-h,最后用新生成的参数列表完全替换掉原来的位置参数。
长选项转短选项代码运行逻辑
这段代码的核心逻辑是遍历所有原始参数,逐个替换长选项,最终生成全部由短选项组成的新参数列表,执行流程如下:
- 首先打印所有原始参数,用于调试校验。
- 循环遍历当前的每一个位置参数:
- 每次循环先执行
shift命令,将当前位置参数列表的第一个参数移除(该参数已经被取出存到$arg变量中待处理)。 - 对取出的
$arg做模式匹配:- 如果匹配到预设的长选项(如
--Version、--help等),就将对应的短选项追加到当前位置参数列表末尾。 - 如果是不需要替换的普通参数,就将原参数直接追加到当前位置参数列表末尾。
- 如果匹配到预设的长选项(如
- 每次循环先执行
- 遍历完成后,原来的位置参数列表就会被替换为全部转换完成的短选项参数列表。
运行示例
假设传入的原始参数为--usage file.txt --Version,代码运行过程如下:
- 第一次循环:
$arg值为--usage,执行shift后剩余参数为file.txt --Version,匹配规则后追加-u,当前参数列表变为file.txt --Version -u。 - 第二次循环:
$arg值为file.txt,执行shift后剩余参数为--Version -u,不属于预设长选项,原参数追加后当前参数列表变为--Version -u file.txt。 - 第三次循环:
$arg值为--Version,执行shift后剩余参数为-u file.txt,匹配规则后追加-V,当前参数列表变为-u file.txt -V。 - 循环结束,最终得到的参数列表全部为短选项格式,完成转换需求。
内容的提问来源于stack exchange,提问作者Nigel
相关产品推荐
相关产品推荐

