Как получить аргумент сценария bash, учитывая его позицию с конца? [дубликат]

/usr/sbin/apache2: not found

Obviamente el archivo no existe. Por lo general, uno esperaría que la distribución proporcione archivos unitarios adecuados. ¿Quizás no instaló Apache de la forma en que se pretendía hacerlo? Puede verificar los archivos instalados(dpkg-query --listfiles apache2)y crear un archivo de unidad correcto.

2
08.12.2018, 10:17
6 ответов

В дополнение (к ответу Кусалананды):

#! /bin/bash 

echo "(bash/ksh): ${@: -1}"
echo "(bash 3.x+): ${!#}"
echo "(bash 3.x+): $BASH_ARGV"
echo "(bash 3.x+/ksh): ${@:$#}"
echo "(bash 3.x+): ${BASH_ARGV[0]}"

и если вы беспокоитесь о портативности:

#!/bin/bash

penultimate=''
ultimate=''

for p in "$@" ; do
    penultimate="$ultimate"
    ultimate="$p"
done

echo "penultimate=$penultimate"
echo "ultimate=$ultimate"
3
27.01.2020, 21:49

Вbash(версии 4.3+ )вы можете присвоить переданные параметры массиву и получить доступ к последнему по индексу-1:

#!/bin/bash

params=( "$@" )
printf 'The last parameter given to the script is %s\n' "${params[-1]}"

foo () {
    params=( "$@" )
    printf 'The last parameter given to the function is %s\n' "${params[-1]}"
}

В общем, отрицательные индексы в массивах обращаются к элементам с конца массива.

4
27.01.2020, 21:49

Чтобы получить любой аргумент из скрипта bash, вы можете использовать нарезку:

#!/bin/bash

# Get 3rd element from the end
from_end1=3
# Get last element
from_end2=1

# Get slice of array [end - from_end1 : end ] of length 1
echo "${@: -$from_end1: 1}"
echo "${@: -$from_end2: 1}"

Вы также можете использовать это для получения N-го элемента:

# Get 2nd element
from_beginning=2

echo "${@: $from_beginning: 1}"

Не забудьте проверить длину; это может вернуть имя вашей программы или пустую строку.

5
27.01.2020, 21:49

В зш самым естественным, я думаю, было бы:

echo "ultimate: ${@[$#]}"
echo "ultimate: ${@[-1]}"
echo "penultimate: ${@[-2]}"
echo "penultimate: ${@[$(($# - 1))]}"
0
27.01.2020, 21:49

Классическими решениями для оболочек POSIX (, которые также работают с ksh, zsh или bash ), являются:

 for last do :;done; echo "last=$last"
 eval "last=\$$#"; echo "last=$last"

Для новых оболочек (ksh93,zsh,bash):

 echo "last=${@: -1}"
 echo "last=${@:(-1)}"
 echo "last=${@:~0}"
 echo "last=${@:$#}"

Только для:

echo "last=${!#}"
echo "last=$BASH_ARGV"
echo "last=${@[-1]}"
echo "last=${@[#]}"

Для предпоследнего аргумента:

 for arg do penultimate=$ultimate; ultimate=$arg; done; echo "$penultimate"
 eval penultimate=\$$((#-1))
 echo "${@:$((#-1)):1}"
 echo "${@: -2:1}"
 echo "${@:~1:1}"
1
27.01.2020, 21:49

Портативный sh, не специфичный для bash -и без петель O (n ):

eval x=\$$(($#-1))

-1дает предпоследний аргумент; замените его нужной позицией относительно конца или полностью отбросьте, если вам нужен самый последний.

4
27.01.2020, 21:49

Теги

Похожие вопросы