Похоже, вы хотите соединить статический список номеров портов с именами серверов, полученными из команды.
Вместо этого сделайте это:
PATH=$MQ_INSTALL_PATH/bin:$PATH
ports=( 60720 60721 60722 60723 60724 )
i=0
dspmq | sed -n '/QMNAME/{ s/.*(\([^)]*\)).*/\1/p; }' |
while read -r server && [ "$i" -lt "${#ports[@]}" ]; do
printf 'Port on %s is %d\n' "$server" "${ports[i]}"
i=$(( i+1 ))
done
По сути, это то, что вы пытались сделать, но использовали два вложенных цикла, а не один цикл с комбинированным условием. Код также считывает имена серверов непосредственно из конвейера команд, который создает их, не сохраняя их в промежуточном массиве.
Если вы хотите передать номера портов в обратном порядке, используйте
PATH=$MQ_INSTALL_PATH/bin:$PATH
ports=( 60720 60721 60722 60723 60724 )
i=${#ports[@]}
dspmq | sed -n '/QMNAME/{ s/.*(\([^)]*\)).*/\1/p; }' |
while read -r server && [ "$i" -gt 0 ]; do
i=$(( i-1 ))
printf 'Port on %s is %d\n' "$server" "${ports[i]}"
done
Выражение ${#ports[@]}
во всех приведенных выше случаях расширяется до количества элементов в массиве ports
.
Команда sed
sed -n '/QMNAME/{ s/.*(\([^)]*\)).*/\1/p; }'
извлечет строку в первой скобке из строк, содержащих строку QMNAME
. Можно также написать
sed -n '/QMNAME/{ s/.*(//; s/).*//p; }'
ATTR{имя файла}
Сопоставьте значения атрибутов sysfs устройства событий.
ATTRS{имя файла}
Найдите в devpath выше устройство с соответствующими значениями атрибута sysfs. Если указано несколько совпадений ATTRS, все они должны совпадать на одном устройстве.
ENV{клавиша}
Сопоставьте со значением свойства устройства.
Если и ENV
, и ATTR
содержат одинаковую информацию, -вы можете использовать любой из них, разницы нет.
ENV
s для рассматриваемого устройства могут содержать значения, полученные от различных родительских устройств. Таким образом, с ENV
вы можете иногда сопоставлять значения с нескольких родительских устройств одновременно, что невозможно с ATTRS
.
Вы должны использовать абсолютный путь в клавишеRUN
(RUN+="/bin/mkdir /home/pi/heyimhere"
в вашем примере):
If no absolute path is given, the program is expected to live in /usr/lib/udev; otherwise, the absolute path must be specified.
Кстати, я не знаю, почему ваше правило выключения работает. Этого не должно быть из-за sbin/shutdown
без ведущего /
.
Как упоминал jasonwryan , вы не можете использовать udev для автоматического монтирования:
Note that running programs that access the network or mount/unmount filesystems is not allowed inside of udev rules, due to the default sandbox that is enforced on systemd-udevd.service.