Bash如何不使用shift命令获取去除前两位后的所有剩余参数
Bash不使用shift排除前两个位置参数的方案
最优原生实现
直接使用Bash内置的位置参数切片语法即可,不需要调用额外工具,也不会修改原始位置参数:
"${@:3}"
该写法表示取从第3个位置参数开始到最后一个的所有参数,完全保留每个参数的原始格式,可正确处理包含空格、特殊字符的文件名,也适配通配符提前展开的场景,且原始的$1、$2不会被修改,后续可正常调用。
实际tar场景示例
假设你的脚本前两个参数分别为打包文件名、压缩选项,后续所有参数为待打包的文件/目录,可参考如下写法:
#!/bin/bash # 调用示例:./pack.sh output.tar.gz z *.txt ./source_dir tar_output="$1" compress_flag="$2" # 提取除前两个外的所有待打包文件 pack_list=("${@:3}") # 执行打包操作 tar -c"${compress_flag}"f "${tar_output}" "${pack_list[@]}" # 后续仍可正常使用$2 echo "本次打包使用的压缩选项为:$2"
旧版Bash兼容写法
如果需要兼容3.x等不支持位置参数直接切片的旧版本Bash,可先将位置参数转存到数组后切片:
# 将所有位置参数存入数组 all_args=("$@") # 数组下标从0开始,前两个参数对应下标0、1,从下标2开始截取所有元素即可 pack_list=("${all_args[@]:2}")
注意事项
- 所有参数展开操作外层必须加双引号,避免触发二次分词和通配符展开,导致包含特殊字符的文件名解析错误
- 该方案比使用awk、cut等外部工具的稳定性更高,不会破坏文件名的原始格式
内容的提问来源于stack exchange,提问作者Bob
相关产品推荐
相关产品推荐

