如何从bash中的命令参数中删除第n个元素

时间:2014-05-14 13:36:37

标签: bash shift

如何从bash中的参数列表中删除第n个元素?

仅出现Shift移除前n个,但我想先保留一些。我想要这样的东西:

#!/bin/sh
set -x

echo $@

shift (from position 2)

echo $@

所以当我打电话时 - 它会从列表中删除“house”:

my.sh 1 house 3
1 house 3
1 3

4 个答案:

答案 0 :(得分:6)

使用内置的setshell parameter expansion

set -- "${@:1:1}" "${@:3}"

将删除第二个位置参数。

您可以使用变量将其设为通用:

n=2   # This variable denotes the nth argument to be removed
set -- "${@:1:n-1}" "${@:n+1}"

答案 1 :(得分:1)

a=$1
shift; shift

echo $a $@

如果有人知道如何以更好的方式做到这一点,我全都耳朵!

答案 2 :(得分:0)

如果你想使用bash,你可以使用bash数组

#!/bin/bash

arg=($0 $@)

或者如果你不需要参数$ 0

arg=($@)

# argument to remove
rm_arg=2
arg=(${arg[@]:0:$rm_arg} ${arg[@]:$(($rm_arg + 1))})

echo ${arg[@]}

现在,您可以使用$1而不是引用${arg[1]}

请记住,bash参数有一个参数$0,而bash数组有一个元素[0]。因此,如果您不将bash参数$ 0分配给bash数组[0]的第一个元素,那么您将在bash数组$1中找到bash参数[0]

答案 3 :(得分:0)

arg=($@)
for VAR in $@; do
    case $VAR in
    A)
        echo removing $VAR
        arg=($(echo $@| sed "s/$VAR//"))
        ;;
      *)
        echo ${arg[@]}
        ;;
    esac
done

结果:

./test.sh  1 2 3 A 4 5
1 2 3 A 4 5
1 2 3 A 4 5
1 2 3 A 4 5
removing A
1 2 3 4 5
1 2 3 4 5