You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 09:27:03