Могу ли я установить переменную сценария bash для вывода команды и для всех строчных букв исключительно с расширением параметра bash? - PullRequest
1 голос
/ 16 мая 2019

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

Вот что у меня было раньше:

host=$(hostname -s | tr '[:upper:]' '[:lower:]')

Вместо этого я сейчас использую два определения (будучи немного короче):

host=$(hostname -s); host=${host,,}

но мне интересно, возможно ли сделать это только в одном определении для хоста, не передавая tr (или что-то еще). Можно ли еще объединить вторую строку?

Редактировать: Именно поэтому я должен скопировать / вставить свой код. На самом деле у меня в сценарии были '[:upper:]' и '[:lower:]', но он был напечатан неправильно.

1 Ответ

1 голос
/ 16 мая 2019

Если у вас Bash 4.0 (выпущен в 2009 году), вы можете объявить host, чтобы преобразование в нижний регистр выполнялось автоматически при назначении:

declare -l host
host=$(hostname -s)

Если код находится в функции, тогда лучше по возможности локализовать переменные, поэтому

local -l host
host=$(hostname -s)

только немного длиннее, чем код, который не вводит имя хоста в нижнем регистре.

Возможно сделать декларацию и присваивание одновременно

declare -l host=$(hostname -s)  # BAD CODE

но Shellcheck будет правильно жаловаться, что это маскирует состояние выхода hostname, поэтому вы не можете обнаружить или обработать ошибку.

В этом конкретном случае объявление и присвоение могут быть безопасно выполнены одновременно, если вы используете встроенную переменную Bash HOSTNAME вместо внешней команды hostname:

declare -l host=${HOSTNAME%%.*}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...