Баш, если на одной строке


51

Я хотел бы знать, как я могу написать, если условия внутри сценария Bash в одной строке.

Например, как я могу написать это в одной строке, а затем поместить следующую, как это, в следующую?

if [ -f "/usr/bin/wine" ]; then
    export WINEARCH=win32
fi

Я спрашиваю об этом, потому что у меня есть несколько псевдонимов в моем .bashrc, и у меня есть один и тот же .bashrc (синхронизированный) в нескольких системах, но мне не нужны все псевдонимы в каждой системе. Я поместил большинство из них в операторы if, и теперь все работает прекрасно, но они занимают много места, по 3 строки плюс пустая строка между ними (мне нравится, когда их легко увидеть)

Я также буду использовать эту технику для переменных среды.


4
Вы также можете написать[ -f "/usr/bin/wine" ] && export WINEARCH=win32
Гленн Джекман

3
Имейте в виду, что короче не обязательно лучше. Вы можете получить незначительные логические ошибки с помощью логических операторов оболочки. Выберите, что легче читать и поддерживать.
Гленн Джекман

Ответы:


84

Вы бы написали это так:

if [ -f "/usr/bin/wine" ]; then export WINEARCH=win32; fi

Обратите внимание, что это также может быть написано (как предложено @glennjackman):

[ -f "/usr/bin/wine" ] && export WINEARCH=win32

1
Ну, это было легко ... :) Теперь я чувствую себя немного неловко, когда спрашиваю об этом. Спасибо за ответ, это очень помогло!
Горациу Млендеа

7
Есть одно отличие. 1. выражение выйдет с нулевым статусом, 2. выражение выйдет с ненулевым статусом, если файл не существует. Это может иметь значение, если вы используете это в некоторых автоматизированных задачах, таких как развертывание, где успех задачи зависит от состояния завершения команды.
Янис Грузис

@ HorațiuMlendea, очевидно, это было легко. если знаешь как. Но синтаксис сложен, например, [1 == 1] - ошибка, но [1 == 1] работает. И точки с запятой. Как вы можете чувствовать себя неловко из-за того, что не знаете какой-то плохо продуманный синтаксис Ваше «чувство» не имеет никакого смысла вообще. Это был полезный вопрос, даже если, к сожалению, вы не понимаете, почему.
barlop

@ Balop нет, я полностью понимаю, что вы имеете в виду, и я согласен. Просто в то время я понимал отдельные биты, составляющие этот синтаксис (тот, что с &&). Обычно это легко и интуитивно понятно, но, как вы сказали, этот язык довольно сложный и не очень интуитивный.
Горациу Млендеа

4

Я также обнаружил, что просто набрав любую сложную команду if then else, нажмите ввод, а затем, после того, как она выполнится, просто нажмите стрелку вверх. Конечно, командная строка будет повторять последнюю набранную команду, но в этом случае она помещает все это в одну строку, как вам нужно. Это обман, но он эффективен.


5
Обратите внимание, что это может зависеть от вашей оболочки (и, возможно, от настроек вашей оболочки). Некоторое быстрое тестирование на моем компьютере показывает, что это работает в Bash (поэтому есть +1), но Zsh сохраняет разрывы строк при возврате к предыдущим командам.
8bittree
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.