Доступ к элементу массива

Предположим, у вас есть файл со списком IP-адресов серверов, именем SERVER и определены только IP-адреса серверов.

Цикл for также будет работать.

for user in $(awk '{print $1}' SERVER | awk '{printf "user1@""%s"(NR==0?RS:"\n"), $1}' ) ;
do
        ssh-copy-id -f -i id_rsa_k2.pub $user
done
0
23.08.2021, 07:20
1 ответ

Во-первых , могу ли я порекомендовать вам запускать все сценарии оболочки через shellcheck -, также доступную как отдельная программа во многих дистрибутивах Linux -для обнаружения синтаксических ошибок. echo $i}например. выглядит как опечатка, которая «работает» только потому, что $iсовпадает с ${i}, а дополнительное }«только» приводит к случайному }, добавленному к предполагаемому выводу.

Во-вторых , кажется, что здесь существует неправильное представление об использовании массивов и переменных. Вы хотите напечатать последний столбец с меткой ipиз «фактической строки данных» вашего вывода. Ваше использование

echo ${arr[ip]}
Однако

не будет работать, потому что вы не объявили (как вdeclare -A arr)и не "заполнили" arrкак ассоциативный массив, а это означает, что такое разыменование массива не будет работать -. ] оболочка ожидает здесь числовой индекс массива. Если вместо этого вы предоставите текстовую строку (, например ip), поведение будет зависеть от оболочки, хотя она, вероятно, интерпретирует это как имя переменной, обнаружит, что переменная не определена (, т.е. оценивается как пустая строка ), а затем вывести только первую запись массива (первой строки в вашем случае ).

Кроме того, даже если вы объявите массив ассоциативным, сопоставление «заголовков столбцов» с «индексами массива» не будет автоматическим; вам нужно сделать это вручную, если вы хотите, чтобы целевой доступ, как вы описываете, работал.

В-третьих, , обработка текста в большинстве случаев лучше выполняется с использованием инструмента -обработки текста, такого как awk, вместо того, чтобы делать это в оболочке.Поскольку вы хотите игнорировать строку заголовка и печатать последний столбец второй строки, я бы рекомендовал

sudo mysql -u root -h localhost -e "USE mydb;SELECT * FROM users" | awk 'NR==2{print $7}'

, который будет обрабатывать вывод вашего sudoвызова, вызывающего команду mysqlчерез программу awk, которая будет обрабатывать только условие второй строки (NR==2)и печатать 7-й столбец, если эта строка встречается.

В-четвертых , лучшим вариантом по-прежнему является выбор данных с помощью самих инструментов базы данных. Я не эксперт по SQL , но думаю, что такой запрос, как

mysql -u root -h localhost -e "USE mydb; SELECT ip FROM users WHERE id='5'"

должно работать (, но, пожалуйста, проверьте его на некритическом примере перед использованием в производственной среде ).

2
23.08.2021, 08:25

Теги

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