Полученное значение из ассоциативного массива неверно?

Этим достигается то, что вы запрашиваете.

sed 's/address.*/&%200/' current.txt

Пример:

$ sed 's/address.*/&%200/' current.txt
ltm node /test/10.90.0.1 {
    address 10.90.0.1%200
}
ltm node /test/10.90.0.12 {
    address 10.90.0.12%200
}

ltm node /test/10.90.0.50 {
address 10.90.0.50%200
}
$
2
03.12.2016, 18:56
2 ответа

По умолчанию bash обрабатывает массивы как индексированные массивы.
В этом случае индексы оцениваются как арифметическое выражение.

$ joe=3    mary=6
$ unset data
$ data=([joe]=111 [mary]=bbb)
$ declare -p data
declare -a data=([3]="111" [6]="bbb")

Вывод показывает несколько вещей:

  • Массив индексирован: -a в выводе.
  • Массив действительно содержит два значения.
  • Индексы значений совпадают с числовыми значениями переменных joe и mary.
  • Значения, содержащиеся в массиве, могут быть строками.

Это так, даже если индексы заключены в кавычки (даже одинарные кавычки):

$ joe=3    mary=6
$ unset data
$ data=(["joe"]=111 ["mary"]=bbb)
$ declare -p data
declare -a data=([3]="111" [6]="bbb") 

Если строки, используемые в качестве индексов, не были определены как содержащие число, они в любом случае оцениваются как арифметическое выражение, имеющее нулевое значение.

$ unset joe    ;    unset mary    ;    unset data
$ data=([joe]=111 [mary]=bbb)
$ declare -p data
declare -a data=([0]="bbb")

Что произошло: [joe]=111 оценивается в [0]=111, устанавливая массив с индексом 0 в 111. Но затем, [mary]=bbb оценивается в [0]=bbb, заменяя значение массива по индексу 0 на bbb.

Чтобы действительно иметь ассоциативный массив, он должен быть определен как таковой до его использования.
Он не может быть изменен, пока содержит данные. С массивом, заданным как указано выше:

$ declare -A data
bash: declare: data: cannot convert indexed to associative array

Но очистив его, мы можем:

$ joe=3  ;  mary=6  ; unset data

$ declare -A data

$ data=([joe]=111 [mary]=bbb)
$ declare -p data
declare -A data=([joe]="111" [mary]="bbb" )

Как видите, не имеет значения, что строки, используемые в качестве индексов, также являются допустимыми именами переменных и что они содержат значение. Они используются как индексы строк для ассоциативного массива.

1
27.01.2020, 22:10

. Ассоциативные массивы должны быть объявлены явно, с типом typeset -A или что-то подобное ( объявить -A или только для чтения -A в bash). По умолчанию массив представляет собой «простой» массив с целочисленными индексами.Нечисловые индексы в массивах с целочисленным индексом интерпретируются как арифметические выражения, а неустановленные имена переменных в арифметических выражениях автоматически интерпретируются как 0, поэтому data = ([joe] = 30 [mary] = 25) устанавливает data [0] = 30 , затем data [0] = 25 , и $ {data [something]} - это элемент 0, который равен 25. .

bash-4.3$ indexed=([a]=aye [b]=bee [x+1]=cee)
bash-4.3$ echo length=${#indexed[@]} a=${indexed[a]} b=${indexed[b]} x+1=${indexed[x+1]} 1=${indexed[1]}
length=2 a=bee b=bee x+1=cee 1=cee
bash-4.3$ typeset -A associative=([a]=aye [b]=bee [x+1]=cee)
bash-4.3$ echo length=${#associative[@]} a=${associative[a]} b=${associative[b]} x+1=${associative[x+1]} 1=${associative[1]}
length=3 a=aye b=bee x+1=cee 1=

Поскольку индексированный является массивом с числовыми индексами, индексированный [a] и индексированный [b] оба индексируются [0] ], а проиндексировано [x + 1] - это проиндексировано [1] . В ассоциативном массиве то, что находится внутри скобок, анализируется как строка (с обычными расширениями, как в двойных кавычках, поэтому вы можете написать $ {ассоциативный [$ key]} ).

1
27.01.2020, 22:10

Теги

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