Bash выполняет расширение переменной строки [дубликат]

Этот простой вариант отлично работает для меня, требуется установить только простой пакет acpi (без демонов, определенных окружений рабочего стола и т.п.).

В пользовательском crontab ( crontab -e ) введите следующее (все в одной строке, здесь она разделена для удобства чтения):

*/3 * * * * acpi --battery | 
    awk -F, '/Discharging/ { if (int($2) < 15) print }' | xargs -ri 
    env DISPLAY=:0 zenity --warning --text "battery low\n{}"

Она проверяет уровень заряда батареи ( acpi --battery ), и если вы не подключены к зарядному устройству ( / Discharging / ) и если уровень заряда батареи %, это будет происходить каждые 3 минуты ( * / 3 ) отобразить сообщение через zenity , чтобы вас подвести.

Вместо zenity вы можете использовать xmessage (на действительно спартанской машине) или даже что-то вроде aplay -q /usr/lib/libreoffice/share/gallery/sounds/cow.wav для звуковых уведомлений (преимущество которых состоит в том, что они не будут прерывать набор текста с клавиатуры и будут работать даже для многопользовательских ноутбуков с несколькими сеансами, когда взлом DISPLAY =: 0 завершится ошибкой)

Если вам также необходимо приостановить / спящий режим на определенном критическом уровне, см. этот ответ

6
20.03.2017, 12:29
2 ответа

use eval

$ test1=\$test2
$ test2="string to print"
$ echo $test2
string to print
$ eval echo $test1
string to print
6
27.01.2020, 20:23
$ test1="hello"
$ test2="test1"

$ echo "${!test2}"
hello

Из руководства bash:

Если первый символ параметра - восклицательный знак (! ), и параметр не является именем, он вводит уровень переменной косвенности. Bash использует значение переменной, сформированной из оставшейся части параметра в качестве имени переменной; эта переменная затем расширяется, и это значение используется в остальной части подстановки, а не а не значение самого параметра. Это известно как косвенное расширение. Если параметр является ссылкой на имя, это расширение выполняется до имени переменной, на которую ссылается параметр, вместо того, чтобы выполнить косвенное расширение. переменной, на которую ссылается параметр, вместо того, чтобы выполнять полное косвенное расширение. Исключением являются расширения типа ${!prefix*} и ${!name[@]}, описанные ниже. Восклицательный знак должен следовать непосредственно за левой скобкой, чтобы ввести косвенность.

Для второй части вопроса я бы, вероятно, постарался избежать использования фактических переменных shell в шаблоне, а вместо этого использовал бы легко разбираемые заполнители и заменил бы их с помощью инструмента типа sed.

Есть несколько похожих вопросов, включая "Как заменить строки-заполнители в документе содержимым из файла", "Инструмент для создания текстовых файлов из шаблона" и "Как заменить список заполнителей в текстовом файле?" (есть и другие).

12
27.01.2020, 20:23

Теги

Похожие вопросы