Как добавить значения в array, который содержит переменную в имени массива в bash?

Вы можете изменить compsec для этих команд, чтобы игнорировать их.

Скажем, например, чтобы получить существующий compsec, используйте

complete -p grep

return,

 complete -F _longopt grep

Теперь добавьте параметр исключения к этой команде как,

complete -F _longopt -X '@(__pycache__|more__patterns)' grep

Вы не увидите эти имена файлов при нажатии вкладки

{{ 1}}
1
14.02.2018, 23:52
1 ответ

referencias de nombre

Creo que un nameref sería lo que quieres:

name=foo
declare -a array_$name
declare -n target=array_$name
for x in asdf 'white space' ; do target+=("$x"); done 
declare -p array_$name

salidas:

declare -a array_foo=([0]="asdf" [1]="white space")

evaluar, declarar, dejar

Las otras formas, peores, serían usar evalo declarepara establecer los valores.

evalse vuelve complicado con las comillas, no desea expandir accidentalmente ningún $dentro de sus valores.

eval "array_$name+=(\"\$x\")"

declarehace que sea un poco dudoso implementar la adición a la matriz. Sin embargo, es bastante sencillo si conoce el índice para asignar a:

declare "array_$name[$i]=$x"

(Obtener el número de elementos en array_$nameparece requerir una referencia de nombre o evalnuevamente.)

Mencionaste let; es un poco como declareaquí, pero funciona con expresiones aritméticas, por lo que no es una buena opción para el caso general.

name=a; 
let "test_$name=12+34"        # sets test_a to 46
let "test_$name=foo"          # reads the _value_ of variable foo!
let "test_$name=foo bar"      # this is an error.

estructuras de datos alternativas

Alternativamente, si solo puede haber uno de cada valor, invierta la estructura de datos y almacene la identificación de grupo de cada valor en una sola matriz:

for (( val=1; val <= 10; val++ )); do
     groupid=$(find_groupid "$val")
     variables[$val]=$groupid
done

Luego camine por toda la matriz e ignore los grupos que no le interesan.

O, si sus valores no contienen ningún espacio en blanco, simplemente use cadenas para las matrices internas. Para recorrerlos, haz algo como

for group in "${groups[@]}"; do 
    for item in $group; do       # no quotes here, we want wordsplitting
       ...

(o use una matriz asociativa allí para almacenar también los nombres de los grupos.)

1
27.01.2020, 23:44

Теги

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