Получить переменную из строки

Вы не можете создать каталог с помощью touch , используйте для этого mkdir :

mkdir -p "$HOME"/mail/.sa-learn/{cur,new,tmp}

Флаг -p сообщает mkdir для создания всех промежуточных папок, если они не существуют, и не будет ошибкой попытаться создать папку, которая уже существует.

Предполагается, что оболочка выполняет расширение скобок. В противном случае разбейте его на три отдельных вызова mkdir .

При перемещении почты (непроверенной):

find "$HOME"/mail -type f -path "*/.spam/*" -print0 |
xargs -0 -I XX mv "XX" "$HOME"/mail/.sa-learn/new/

Это позволит найти всю почту (новую или старую) в любой папке .spam в папке $ HOME / mail и переместить их в папку .sa-learn / new папка.

Я использую «$ HOME» , а не ~ в скриптах, потому что мне кажется, что он выглядит лучше, самодокументируется и ведет себя как любая другая переменная ( ~ нет).

1
28.03.2017, 23:05
4 ответа

Если вы собираетесь использовать этот скрипт / var на своем компьютере, имя устройства будет все время одинаковым. Таким образом, вы можете просто сделать

$ xinput list --id-only "SynPS/2 Synaptics TouchPad"
#Output:
12

, чтобы сохранить его в переменной:

$ var=$(xinput list --id-only "SynPS/2 Synaptics TouchPad")
1
27.01.2020, 23:16
device_id=$(xinput | sed -n 's/.*TouchPad.*id=\([0-9]*\).*/\1/p')

См. другой ответ для описания распространенной идиомы sed .

2
27.01.2020, 23:16

Вам не нужно получать числовой идентификатор устройства, вы можете использовать строку напрямую. Используйте список xinput --name-only | grep Touchpad для вывода списка имен устройств, содержащих слово «Touchpad», по одному в каждой строке.

Если вам нужен числовой идентификатор, снова вызовите xinput list , на этот раз с - только id .

name=$(xinput list --name-only | grep Touchpad)
nl='
'
case "$name" in
  *"$nl"*) echo "Multiple touchpad devices found, aborting"; exit 2;;
  "") echo "No touchpad device found, aborting"; exit 2;;
esac
id=$(xinput list --id-only "$name")
2
27.01.2020, 23:16

Прямой, если не самый эффективный, способ:

deviceid="$(xinput | grep "TouchPad" | grep -oE 'id=[^ ]+' | cut -d= -f2)"

Затем вы можете ссылаться на "$deviceid" в вашем скрипте(ах).

Чтобы увидеть, как это работает, я сначала выполняю команду, с которой вы начали, чтобы получить строку ввода для разбора. Затем я использую grep -o, который возвращает только совпавшие данные, а не всю строку, и -E, который позволяет использовать более лаконичный синтаксис. Выражение /id=[^ ]+/ означает "i, d, символ = и один или несколько символов, которые не являются пробелом. В результате извлекается id=12. Затем я отправляю это в cut, которому я говорю разделить вход на = символов (с помощью переключателя -d (для dэлиминатора)) и взять второе поле, которое является 12, как вы хотели.

Все это выполняется во вложенной оболочке, вывод которой используется в качестве значения переменной.

0
27.01.2020, 23:16

Теги

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