Получите только второй последний аргумент предыдущей команды

[ -f /root/.bash_aliases ] || echo "$_" 

дает мне ]

Я хочу /root/.bash_aliases

Я также пробовал

 [ -f /root/.bash_aliases ] || echo !:2 

но это дает мне следующий результат:

 [ -f /root/.bash_aliases ] || echo /root/.bash_aliases /root/.bash_aliases 

Я хочу только /root/.bash_aliases

  • Сравнение отрицательных значений в bash с использованием массивов
  • Является ли оболочка созданной `bash -i -c <command>` интерактивной?
  • ^ Символы C в начале редактирования команды bash bash
  • как заменить значение вычислением в bash / sed
  • Сдвиг аргументов bash справа
  • stdout для регистрации, stderr для входа в систему и консоли
  • Как запустить скрипт оболочки внутри сценария оболочки
  • Проверьте, существует ли имя файла из встроенной команды
  • 2 Solutions collect form web for “Получите только второй последний аргумент предыдущей команды”

    Это то, что выполняет функции:

     print_if_not_regular() { [ -f "$1" ] || printf '%s\n' "$1" } print_if_not_regular /root/.bash_aliases 

    Некоторые оболочки, такие как es или zsh имеют анонимные функции:

     (){[ -f "$1" ] || printf '%s\n' $1} /root/.bash_aliases # zsh @ {[ -f $1 ] || printf '%s\n' $1} /root/.bash_aliases # es 

    Я бы не использовал $_ . Он больше не работает, если у вас есть ловушка DEBUG.

     $ bash -c 'trap ": \"\$((cmdcount+=1))\"" DEBUG; echo foo; echo "$_"' foo 2 

    Заметим, что !:n – не n- й аргумент последней команды, а n- й лексический токен предыдущей командной строки (последняя строка (возможно, даже многострочная), хранящаяся в истории). Например, в

     echo $(echo AB) echo foo; echo !:1 

    Это !:1 не расширен до foo (последний аргумент последней команды), а не B (последний аргумент echo из команды echo предыдущей командной строки), но $(echo AB) . Здесь вам нужно будет ввести:

     [ -f /root/.bash_aliases ] || echo !:2 

    То есть введите его на отдельных строках. Здесь это происходит (случайно), даже если строка истории не полностью завершена к моменту ввода этой второй строки. Тот же трюк не работает в (t)csh (откуда происходит расширение истории), а не zsh .

    использование

     test -f /root/.bash_aliases || echo "$_" 

    или

     test -f /root/.bash_aliases || printf '%s\n' "$_" 

    $_ будет расширяться до последнего аргумента предыдущей команды. В вашем примере предыдущая команда [ и ее последний аргумент ] .

    Выше, последняя команда – это test а последний аргумент – имя файла.

    test и [ – одни и те же команды, но [ требуется ] качестве последнего аргумента командной строки. В этом случае это затрудняет использование $_ для получения имени файла.

    Вышеупомянутое решение имеет преимущество при работе, по крайней мере, в bash (если у вас нет набора ловушек DEBUG ) и zsh .


    Если у вас есть имя файла в переменной, было бы тривиально делать

     [ -f "$name" ] || printf '%s\n' "$name" 

    или

     if [ ! -f "$name" ]; then printf '%s\n' "$name" fi 

    в зависимости от ваших предпочтений для операторов if и логических тестов короткого замыкания.

    Linux и Unix - лучшая ОС в мире.