[
] Возможно, это самый уродливый Bash-код, который я когда-либо писал, но...[
] [
IPv4_first=1.1.1.1
IPv4_second=2.2.2.2
IPv4_third=3.3.3.3
names=(${!IPv4_@})
eval "IPv4_all=(${names[@]/#/$})"
printf "'%s'\n" "${IPv4_all[@]}"
] [
]Смотри, Ма, никакого цикла![
] [
][][]${names[@]/#/$}[
] предиктует[] []$[
] к началу каждого элемента массива, сопоставляя пустую строку, привязанную к началу каждого элемента. Это дает массив разыменований переменных, который мы можем развернуть внутри []eval[
], чтобы получить ссылки на переменные внутри инициализатора массива. Это должны быть две отдельные строки, так как нельзя применять несколько расширений параметров одновременно.[
] [
]Вывод:[
] [
'1.1.1.1'
'2.2.2.2'
'3.3.3.3'
] [
], как и ожидалось.[
] [
]Строку можно заменить на:[
] [
IPv4_all=($(eval "echo ${names[@]/#/$}"))
] [
]вместо []eval[
]ling для присваивания массива. Не уверен, что это лучше или нет.[
] [
]Если значения переменных могут содержать пробелы или другие символы IFS, вы можете изменить eval:[
] [
eval "IPv4_all=($(printf '"$%s" ' "${names[@]}"))"
] [
]Это правильно удвоит все разыменования переменных.[
].
Попробуйте это:
# Set mount directory for partition-less sticks
SUBSYSTEM=="block", ACTION=="add", ENV{myBusID}!="", ENV{myDevID}!="", ENV{myPartition}=="", ENV{ID_PART_TABLE_TYPE}=="", ENV{dir_name}="usb-%k-%E{myBusID}-%E{myDevID}--%E{myPartition}"