12

シェルプログラムに与えられた最後から2番目の項目を取得したいと思います。現在、私はこのようにしています:

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 

これを行うにはもっと簡単な方法があると確信しています。では、シェルスクリプト入力から最後から2番目の引数をできるだけ少ない行で取得するにはどうすればよいでしょうか。

4

4 に答える 4

23
set -- "first argument" "second argument" \
       "third argument" "fourth argument" \
       "fifth argument"
second_to_last="${@:(-2):1}"
echo "$second_to_last"

引用符に注意してください。これにより、空白を含む引数がくっつくようになります。これは、元のソリューションでは実行されません。

于 2012-06-15T16:51:18.730 に答える
6

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
于 2012-06-15T16:51:44.080 に答える
5
n=$(($#-1))
second_to_last=${!n}
echo "$second_to_last"
于 2012-06-15T16:51:33.143 に答える
4

すべての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

本当に古いシェルの場合は、evalを使用する必要があります。

eval "printf \"%s\n\" \"\$$(($#-1))\""
于 2019-06-14T20:48:43.990 に答える