read -p "$1:" tmp1
и read -p "$2:" tmp2
считывают по строке ввода от пользователя каждый, используя первый($1
)и второй($2
)аргументы функции в качестве подсказок. Результаты сохраняются в tmp1
и tmp2
. Затем, если они равны, значение из tmp1
считывается в переменную, названную первым аргументом функции сread "$1" <<< "$tmp1"
Итак, то, что вы получите с помощью read_and_verify domain "Please enter the domain of your web application twice"
, выглядит примерно так, а введенные пользователем данные выделены курсивом:
domain:foo Please enter the domain of your web application twice:foo
Затем введенное значение сохраняется в переменной domain
; работает echo "$domain"
после того, как выше показано foo
.
I misunderstand why is the $1 and $2 needed and henceforth why is the read "$1" <<< "$tmp1" needed.
$1
и $2
используются в качестве подсказок пользователю, а $1
— это , также используется для передачи имени результирующей переменной в функцию. Это делает первую подсказку немного странной. Возможно, лучше использовать что-то более описательное, например.:
read -p "Please enter value for '$1': " tmp1
read -p "Please repeat the value to verify: " tmp2
Или использовать сообщение, переданное в $2
, для обоих подсказок, как это делает ответ на ваш другой вопрос .
read "$1" <<< "$tmp1"
также несколько странен, поскольку обычно вы можете просто присвоить значение одной переменной другой. Однако здесь проблема в том, что $1
содержит имя переменной, поэтому нам нужно косвенное присвоение. В Bash 4.3 и более поздних версиях мы могли бы использовать для этого ссылку на имя :
.
declare -n ref="$1"
ref=$tmp1
Таким образом, всю функцию лучше написать так:
#!/bin/bash
function read_and_verify {
read -p "Please enter value for '$1': " tmp1
read -p "Please repeat the value to verify: " tmp2
if [ "$tmp1" != "$tmp2" ]; then
echo "Values unmatched. Please try again."; return 2
else
declare -n ref="$1"
ref=$tmp1
fi
}
(обратите внимание, что здесь не используется второй аргумент.)
Если вы используете GNOME в качестве DE, где-то в настройках языка есть параметр (не могу вспомнить, где ), но если вы наткнетесь на поле выбора, где значение равно IBus, измените значение на None, и вы должны быть готовы к изменению раскладки клавиатуры
Я наткнулся здесь, когда искал решение той же проблемы с XFCE