Начните с простейшего возможного случая.Создание функции:
f() { read -p "Type smthng: " $1 ; }
Вызов функции, присвоение переменной $ p для удержания ее ввода, затем отображение ввода после выхода функции:
f p ; echo $p
It запросов, я набираю «woof», и echo $ p
выводит то же самое:
Type smthng: woof
woof
Один из способов проверить переменную - заключить эту функцию в другую:
g() { unset $1 ; until f "$1" && eval [ \"\$"$1"\" ] ; do echo wrong ; done ; }
Сложность заключается в том, что OP хочет чтобы назначить имя переменной как параметр функции, для анализа которого я использую "evil" eval
. Передача имен переменных в качестве параметров функции выполняется редко (или требуется), но здесь показан один из способов сделать это.
Протестируйте:
g p ; echo $p
Появляется запрос, я нажимаю Enter , выводится сообщение об ошибке; затем во втором приглашении я набираю «foo»:
Type smthng:
wrong
Type smthng: foo
foo
Эта часть кода OP не будет работать:
if [[ -z $$var ]]; then
$$
- это переменная bash
, которая возвращает текущий PID:
man bash | grep -A 28 "Special Parameters$" | sed -n '1,3p;28,$p'
Special Parameters
The shell treats several parameters specially. These parameters may only
be referenced; assignment to them is not allowed.
$ Expands to the process ID of the shell. In a () subshell, it expands
to the process ID of the current shell, not the subshell.
Как указано в комментариях, самое простое решение, по-видимому, состоит в том, чтобы сначала удалить ключ, а затем запустить --list-secret-keys
для нового файла:
$ gpg --dearmor secret.asc # Creates secret.asc.gpg
$ gpg --with-fingerprint --no-default-keyring --secret-keyring./secret.asc.gpg --list-secret-keys
Раздражает то, что, несмотря на то, что деарморированный ключ может быть записан на стандартный вывод с опцией -o -
, ни --secret-keyring -
, ни --secret-keyring /dev/stdin
не позволят второй команде считать ключ со стандартного ввода, поэтому объединение двух команд в одну с помощью труба не вариант. Кроме того, выполнение второй команды с gpg2
вместо gpg
по-прежнему не дает желаемого результата.
Чуть более сложный подход, но тот, который работает с обеими версиями gpg
, состоит в том, чтобы импортировать секретный ключ во временный домашний каталог GPG, а затем перечислить закрытые ключи временного дома.:
$ mkdir -m 0700 tmphome
$ gpg --homedir tmphome --import secret.asc
$ gpg --homedir tmphome --with-fingerprint --list-secret-keys
Это, вероятно, изменилось с новыми версиями GnuPG, так как в настоящее время вы можете сделать это в одном канале:
$ gpg --with-colons --import-options show-only --import --fingerprint < secret.asc | awk -F: '$1 == "fpr" {print $10;}'
Главным изменением правил игры является опция import-options
, которая включает фальшивый импорт . Мы просто работаем с файлом, так как он был бы импортирован, но это не так.
Опция --with-colons
гарантирует стабильный и машинный -анализируемый формат, который мы используем в последней awk
части.
awk
просто печатает 10-й столбец из строки с отпечатком (, который начинается сfpr
).
Начиная с gpg 2.2.8 (, выпущенного в середине -2018 ), появилась опция --show-keys
для отображения ключей без их импорта, предоставлена в качестве ярлыка для--import --import-options show-only
.
Показать ключ (с )в файлеsecret.asc
:
$ gpg --show-keys secret.asc
Другой формат отпечатка пальца:
$ gpg --show-keys --with-fingerprint secret.asc