如何从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
答案 0 :(得分:6)
使用内置的set
和shell 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