Вот как сделать то, что вы просили (по крайней мере, bash 4+), учитывая кучу предостережений о том, как заполнен ваш CSV (без встроенных запятых или новых строк в полях, например, см. Что наиболее надежный способ эффективного анализа CSV с помощью awk? ):
$ cat file
a,b,c
d,e,f
$ IFS=, read -r -a array < <(awk -F, -v var='d' '$1 == var' file)
или:
$ readarray -t array < <(awk -F, -v var='d' '$1 == var{gsub(FS,ORS); print}' file)
, любой из которых заполняет array
как:
$ declare -p array
declare -a array=([0]="d" [1]="e" [2]="f")
Я бы, вероятно, просто использовал подход read
вместо readarray
в этом случае, так как вы просто читаете одну строку и вам нужно сделать так, чтобы awk преобразовывал каждую запятую в новую строку, чтобы подход readarray работал.
Таким образом, ваш код станет, например:
get_row() {
IFS=, read -r -a array < <(awk -F, -v var="$1" '$1 == var' file)
echo "${array[@]}"
}
get_row 'some_value'
ssh "${array[1]}" -p "${array[2]}" -l "${array[0]}"
или лучше, поскольку для него не требуется, чтобы массив, заполненный в функции, был глобальным:
$ cat tst.sh
#!/bin/env bash
get_row() {
declare -n arrayName="$1"
local keyVal="$2"
IFS=, read -r -a arrayName < <(awk -F, -v var="$keyVal" '$1 == var' file)
}
get_row 'array' 'd'
echo ssh "${array[1]}" -p "${array[2]}" -l "${array[0]}"
$ ./tst.sh
ssh e -p f -l d
или вы можете получить get_row()
, просто получить строку и затем заполнить array
ее выводом:
$ cat tst.sh
#!/bin/env bash
get_row() { awk -F, -v var="$1" '$1 == var' file; }
IFS=, read -r -a array < <(get_row 'd')
echo ssh "${array[1]}" -p "${array[2]}" -l "${array[0]}"
$ ./tst.sh
ssh e -p f -l d
Как и в большинстве вещей в UNIX, у вас есть много вариантов: -).