如何从shell脚本获取倒数第二个参数?

Nie*_*ein 7 unix bash arguments sh

我想获得给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 
Run Code Online (Sandbox Code Playgroud)

我确信有一种更简单的方法可以做到这一点.那么如何从尽可能少的行中获取shell脚本输入中的倒数第二个参数呢?

Cha*_*ffy 17

set -- "first argument" "second argument" \
       "third argument" "fourth argument" \
       "fifth argument"
second_to_last="${@:(-2):1}"
echo "$second_to_last"
Run Code Online (Sandbox Code Playgroud)

注意引用,它确保将空格的参数粘在一起 - 这是原始解决方案不能做到的.


Igo*_*bin 6

在 bash/ksh/zsh 中,您可以简单地 ${@: -2:1}

$ set a b c d 
$ echo ${@: -1:1}
c
Run Code Online (Sandbox Code Playgroud)

在 POSIX sh 中,您可以使用eval

$ set a b c d 
$ echo $(eval "echo \$$(($#-2))")
c
Run Code Online (Sandbox Code Playgroud)


And*_*ark 5

n=$(($#-1))
second_to_last=${!n}
echo "$second_to_last"
Run Code Online (Sandbox Code Playgroud)


小智 5

所有 bash 版本都有一些选项:

$ set -- aa bb cc dd ee ff
$ echo "${@: -2:1}   ${@:(-2):1}   ${@:(~1):1}   ${@:~1:1}   ${@:$#-1:1}"
ee   ee   ee   ee   ee
Run Code Online (Sandbox Code Playgroud)

( ~) 是按位求反运算符(在“算术求值”部分中搜索)。
这意味着翻转所有位

甚至可以使用(整数)变量来完成选择:

$ 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
Run Code Online (Sandbox Code Playgroud)

对于非常旧的 shell,您必须使用 eval:

eval "printf \"%s\n\" \"\$$(($#-1))\""
Run Code Online (Sandbox Code Playgroud)