Ответ (один из них, я уверен )это:
sort -t _ -k 2 -g [filename with names+numbers or piped from another command with | - both situations will work ]
Проблема в том, что вам нужно дважды интерпретировать массив. Если 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}"
Хотя первый вариант лучше для читабельности.
Почему бы вам не инвертировать массив:
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 Параметры оболочки в руководстве