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

如何设置任意位置参数并保留其余参数?以ls包装器为例

实现让-S始终作为最后生效选项的ls包装器

咱们先理清楚问题核心:当你直接用ls "$@" -S时,如果参数里没有--,这个写法没问题,-S会覆盖之前的排序选项;但如果参数里包含--,ls会把--之后的所有内容都当作文件名,这时候-S就会被当成文件名处理,完全达不到按大小排序的效果。

所以关键思路是:找到第一个--的位置,把-S插在它前面;如果没有--,就把-S追加到参数末尾。下面是靠谱的实现脚本:

#!/bin/bash

# 初始化数组存放处理后的参数,避免字符串拆分问题
processed_args=()
dash_found=0

# 遍历所有传入的参数
for arg in "$@"; do
    # 只处理第一个出现的--
    if [[ "$arg" == "--" && $dash_found -eq 0 ]]; then
        # 先插入-S,再加入--
        processed_args+=("-S")
        processed_args+=("$arg")
        dash_found=1
    else
        # 其他参数直接加入列表
        processed_args+=("$arg")
    fi
done

# 如果全程没找到--,就把-S加到参数最后
if [[ $dash_found -eq 0 ]]; then
    processed_args+=("-S")
fi

# 调用ls,确保每个参数(包括带空格的文件名)都正确传递
ls "${processed_args[@]}"

代码说明:

  • 用数组processed_args构建新参数列表,能完美处理带空格的文件名或参数,避免普通字符串处理时的拆分bug。
  • 标记dash_found用来确保只处理第一个--,后续如果还有--(虽然场景极少),会直接当作普通参数传递。
  • 不管有没有--,最终-S都会出现在所有选项的最后(或--的前面),确保它的优先级最高,覆盖其他排序选项。

对比你原来的代码,直接用set的方式会丢失之前的参数,且无法正确处理带空格的内容,用数组的方式才是稳妥的做法。

内容的提问来源于stack exchange,提问作者Jean Hans

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:54:36