Использование имени динамического массива для извлечения значения

Ответ (один из них, я уверен )это:

sort -t _ -k 2 -g [filename with names+numbers or piped from another command with | - both situations will work ]
0
24.11.2020, 18:05
2 ответа

Проблема в том, что вам нужно дважды интерпретировать массив. Если left="air", $left[remote] НЕ равно air[remote].
Чтобы выполнить двойную замену, вам нужно сначала интерпретировать $leftв air, а затем интерпретировать air[remote]Вот так:
$ air[remote]="/home/air" $ left="air" ; For clarity, lets make a temporary variable with the first substitution $ name_var='${'$left'[remote]}' ; Lets see the value of name_var $ echo $name_var ${air[remote]} ; Now, we need to force the shell to interpret this value $ eval echo $name_var /home/air ; Or, to store this in a value resolved_value=$( eval echo $name_var )
Или, как один лайнер:
resolved_value=$( eval echo '${'$left'[remote]}' )

Как это работает:
Хитрость заключается в создании переменной $name _var :
. '${' (с одинарными кавычками, а не с двойными )указывает на использование символов как есть (, т.е. не интерпретировать их как переменную с именем{
Затем $left будет заменено значением «воздух»
. '[remote]}' будет использовать эти символы как есть. (Опять же, одинарные кавычки, а не двойные)
затем команда evalподставляет символы (или содержимое переменной $name _var )в интерпретатор и обрабатывает его результаты, которые затем являются значением переменной ${air[remote]}"

В своем коде вы можете создать переменную значения $resolved _и поместить ее в свой скрипт :
.printf '%b\n' "mount ${right},sshfs -o workaround=rename $left@$right:${resolved_value} /home/schwim/Remote/SSHFS/${acct}"

Или вставьте выражение целиком:
printf '%b\n' "mount ${right},sshfs -o workaround=rename $left@$right:$( eval echo '${'$left'[remote]}' ) /home/schwim/Remote/SSHFS/${acct}"

Хотя первый вариант лучше для читабельности.

0
18.03.2021, 22:47

Почему бы вам не инвертировать массив:

declare -A remotes=(
    [air]="/home/air"
    [bhm]="/home/bhm"
    [imserver3]="/var/www/clients/client1/web7/home/schwimserver3"
)

Тогда вы должны использовать "${remotes[$left]}".

Вот почему ассоциативные массивы настолько полезны, :что вам не нужно использовать имена динамических переменных.


Чтобы использовать динамические имена, используйте bash версии 4.3+ и используйте namerefs:

declare -A foo=( [bar]=baz )
left=foo
declare -n ref=$left
echo "${ref[bar]}"

См. 3.4 Параметры оболочки в руководстве

0
18.03.2021, 22:47

Теги

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