如何设置任意位置参数,同时仍然保留其余的?

时间:2018-04-22 20:08:10

标签: bash shell unix

我想做这样的事情,但保留$i之后的每个参数:

for i in "$@"; do
    if [[ $i == "--" ]]; then
        set $i "-S --"
        break
    fi
done
ls "$@"

在这个例子中,我想在ls上创建一个简单的包装器,其中-S始终是应用的最终选项。

如果参数没有“ - ”:

,这很简单
ls "$@" -S

但是,只要有“ - ”作为参数,就会中断。

要解决此问题,我想首先找到--,并在其前面放置一个-S

编辑:

我不使用的原因:

ls -S "$@" 

是因为我希望输出按大小LAST排序。因此,如果将-t传递给参数,则输出应按修改时间THEN按大小排序。那个用例在这里失败了:

ls -S -t

1 个答案:

答案 0 :(得分:1)

通过迭代第一个数组并在需要的位置插入-S来创建第二个数组。

#! /bin/bash
arr=()
for arg in "$@" ; do
    if [[ $arg == -- ]] ; then
        arr+=(-S --)
    else
        arr+=("$arg")
    fi
done

ls "${arr[@]}"

您可能只需插入一次即可完全正确:

#! /bin/bash
arr=()
inserted=
for arg in "$@" ; do
    if [[ $arg == -- && ! $inserted ]] ; then
        arr+=(-S --)
        inserted=1
    else
        arr+=("$arg")
    fi
done

如果您确实需要设置位置参数,请使用

set "${arr[@]}"

将位置参数设置为$ {arr [@]}的成员。