如何设置任意位置参数并保留其余参数?以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
相关产品推荐
相关产品推荐

