Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: bash Как получить предпоследний аргумент скрипта?  (Прочитано 1597 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Electricity

  • Автор темы
  • Участник
  • *
  • Сообщений: 241
    • Просмотр профиля
Здравствуйте.
Вот это последний аргумент получает:
echo - ${@: -1} -А вот так, экспериментальным путём предпоследний:
echo - ${@: -3:1} -Правильно?
Тогда почему там 3, а не 2, если цифра это номер элемента с хвоста?
Kubuntu 18.04 amd64, Qt: 5.9.5, KDE Frameworks: 5.44.0, plasmashell 5.12.7, корпус чёрный, клава белая

Оффлайн Cxms

  • Активист
  • *
  • Сообщений: 407
    • Просмотр профиля
${@: -1}Это один символ с конца

${@: -3:1}Это один символ начиная с тетьего символа с конца.

Вариант получения предпоследнего аргумента (-Ar4):
Все аргументы: -Ar1 -Ar2 -Ar3 -Ar4 -Ar5
Код: (bash) [Выделить]
PRE_LAST_ARG=$(echo "$*" | cut -d " " -f $(($#-1)))
« Последнее редактирование: 26 Ноябрь 2015, 06:55:41 от Cxms »

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Electricity,
Возможно перед последним элементом у Вас 2 пробела?
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн spk-ubuntu

  • Активист
  • *
  • Сообщений: 502
    • Просмотр профиля
Код: (bash) [Выделить]
#!/bin/bash

declare -a argv # массив аргументов командной строки
argc=$# # количество аргументов командной строки

for ((i=1; i<=argc; i++)) # или for i in $(seq $argc)
do
  argv[$i]=$1
  shift
done

if [ $argc -gt 1 ]
then
  let "penultimate=$argc - 1"
  echo Предпоследний аргумент = "${argv[$penultimate]}", его индекс = $penultimate
else
  echo Недостаточно аргументов!
fi

Оффлайн Cxms

  • Активист
  • *
  • Сообщений: 407
    • Просмотр профиля
N=$(($#-1)))Получаем в переменную N номер пердпоследнего аргумента,
но как вывести аргумет c номером $N?
${$N} - не работает.

Оффлайн Peter_I

  • Старожил
  • *
  • Сообщений: 2392
    • Просмотр профиля
А попробуйте так:
echo ${BASH_ARGV[1]}у меня оно вывело именно предпоследний аргумент, а у последнего индекс 0.
Пётр.

Оффлайн Cxms

  • Активист
  • *
  • Сообщений: 407
    • Просмотр профиля
Работает, это будет лучшее решение.

Оффлайн spk-ubuntu

  • Активист
  • *
  • Сообщений: 502
    • Просмотр профиля
Код: (bash) [Выделить]
#!/bin/bash
argc=$#
let "prev=argc-1"
echo ${!prev}

Оффлайн Cxms

  • Активист
  • *
  • Сообщений: 407
    • Просмотр профиля
spk-ubuntu,
Да оно :D
« Последнее редактирование: 30 Ноябрь 2015, 08:19:14 от Cxms »

Оффлайн 027

  • Участник
  • *
  • Сообщений: 110
  • Cinnamon
    • Просмотр профиля
Здравствуйте.
Вот это последний аргумент получает:
echo - ${@: -1} -А вот так, экспериментальным путём предпоследний:
echo - ${@: -3:1} -Правильно?
Тогда почему там 3, а не 2, если цифра это номер элемента с хвоста?

Как это у вас получается? У меня работает ожидаемым образом:

Скрипт test.sh:
#!/bin/bash
echo "${@: -1:1}"  # последний аргумент
echo "${@: -1}"    # краткая форма
echo "${@: -2:1}"  # предпоследний
echo "${@: -3:1}"  # третий с конца
echo "${@: -4:1}"  # четвертый с конца

Результат выполнения:
$ ./test.sh will_not_show -a --qwerty "arg with space" https://forum.ubuntu.ru/index.php?topic=270212.0
https://forum.ubuntu.ru/index.php?topic=270212.0
https://forum.ubuntu.ru/index.php?topic=270212.0
arg with space
--qwerty
-a

GNU bash, версия 5.0.17(1)-release (x86_64-pc-linux-gnu)
Если бы было достаточно man bash, не было бы ABS.

 

Страница сгенерирована за 0.12 секунд. Запросов: 26.