我想获得给shell程序的第二个最后一项。目前我这样做:
file1_tmp="${@: -2}"
oldIFS=$IFS
IFS=" "
count=0
for value in $file1; do
if [[ count -e 0 ]]; then
file1=$value
fi
count=1
done
oldIFS=$IFS
我确信有一种更简单的方法可以做到这一点。那么如何从尽可能少的行中获取shell脚本输入的倒数第二个参数呢?
答案 0 :(得分:16)
set -- "first argument" "second argument" \
"third argument" "fourth argument" \
"fifth argument"
second_to_last="${@:(-2):1}"
echo "$second_to_last"
请注意引用,以确保将空格的参数粘在一起 - 原始解决方案不会这样做。
答案 1 :(得分:4)
在bash / ksh / zsh中,您只需${@: -2:1}
$ set a b c d
$ echo ${@: -1:1}
c
在POSIX sh中,您可以使用eval
:
$ set a b c d
$ echo $(eval "echo \$$(($#-2))")
c
答案 2 :(得分:2)
n=$(($#-1))
second_to_last=${!n}
echo "$second_to_last"
答案 3 :(得分:1)
所有bash版本都有一些选项:
$ set -- aa bb cc dd ee ff
$ echo "${@: -2:1} ${@:(-2):1} ${@:(~1):1} ${@:~1:1} ${@:$#-1:1}"
ee ee ee ee ee
(~
是按位取反运算符(在“算术评估”部分中进行搜索)。
这意味着翻转所有位。
甚至可以使用(整数)变量进行选择:
$ a=1 ; b=-a; echo "${@:b-1:1} ${@:(b-1):1} ${@:(~a):1} ${@:~a:1} ${@:$#-a:1}"
ee ee ee ee ee
$ a=2 ; b=-a; echo "${@:b-1:1} ${@:(b-1):1} ${@:(~a):1} ${@:~a:1} ${@:$#-a:1}"
dd dd dd dd dd
对于真正的旧shell,必须使用eval:
eval "printf \"%s\n\" \"\$$(($#-1))\""