Как хранить значения в массиве linux

  1. Поддерживает ли ваш адаптер Wi-Fi несколько управляемых интерфейсов? Проверьте строку «допустимые комбинации интерфейсов» в iw phy.

  2. Не используйте устройство смены MAC-адресов, установите MAC-адрес при добавлении интерфейса(iw dev <devname> interface add... addr <mac-addr>).

  3. Многочисленные интерфейсы с разными IP-адресами — это головная боль, потому что каждая используемая вами программа должна иметь возможность привязываться к одному интерфейсу, и даже в этом случае могут быть сюрпризы, поэтому убедитесь, что вы запускаете как dhclient, так и wpa_supplicantтолько на том интерфейсе, который в этом нуждается.

Если это по-прежнему не работает, отредактируйте вопрос, указав точные команды, которые вы использовали (для всех интерфейсов ).

1
04.01.2020, 17:31
4 ответа

Если вы хотите передать|-разделенные данные и сохранить их в массиве bash, вы можете сделать:

#!/bin/env bash

alpha=( $(sed 's/|/ /g' <<<"$@") )
## Arrays start counting at 0, so 1 is the 2nd value
for i in 1 2 3; do
  echo "Field $((i+1)) $i is: ${alpha[i]}"
done

Затем вы можете запустить скрипт следующим образом:

$ foo.sh "123|23.23|2.34|3.45|2019-20-1"
Field 2 1 is: 23.23
Field 3 2 is: 2.34
Field 4 3 is: 3.45

Если вы только хотите сохранить определенные значения, по какой-то причине вы можете сделать что-то вроде:

#!/bin/env bash

temp=( $(sed 's/|/ /g' <<<"$@") )
alpha=( ${temp[1]} ${temp[2]} ${temp[3]} )
echo "Fields 2, 3 and 4 were: ${alpha[@]}"

Что напечатает:

$ foo.sh "123|23.23|2.34|3.45|2019-20-1"
Fields 2, 3 and 4 were: 23.23 2.34 3.45
-1
27.01.2020, 23:55
#!/bin/bash

# Read the data into the array fields from the
# file called "file". This assumes that the data
# is a single line with fields delimited by
# |-characters.
mapfile -d '|' -t fields <file

# The last entry in the fields array will quite
# likely have a trailing newline at the end of it.
# Remove that newline if it exists.
fields[-1]=${fields[-1]%$'\n'}

# These are the column numbers from the original
# data that we'd like to keep.
set -- 2 3 4

# Extract those columns from the fields array. Note
# that we have to decrement the numbers by one as
# arrays in bash are indexed from zero.
for column do
        array+=( "${fields[column-1]}" )
done

# Output the elements of the resulting array:
printf '%s\n' "${array[@]}"

# For outputting with spaces in-between the values
# rather than newlines:
printf '%s\n' "${array[*]}"

Нет причин выводить значения массива в конце, если вы собираетесь использовать их для других целей. Заявление о том, что вы хотите вывести значения в определенном формате(с пробелами между ними ), подразумевает, что вы просто собираетесь их разобрать снова с каким-то другим кодом . Это было бы совершенно ненужным, поскольку у вас уже есть значения в массиве.

Чтобы перебрать массив значений в цикле:

for value in "${array[@]}"; do
    # Use "$value" here.
done

Или, используя исходный массив данныхfields:

for column in 2 3 4; do
    value=${fields[column-1]}
    # Use "$value" here.
done
0
27.01.2020, 23:55

Разделение в bash— это то, что происходит, когда вы не заключаете в кавычки расширение параметра или подстановку команды, или $(<...)или арифметическое расширение.

Так вот:

IFS='|'                # split on | instead of the default of SPC|TAB|NL

set -o noglob          # disable globbing which is another side effect of leaving
                       # expansions unquoted

set -- $(<file.data)'' # do the splitting. The extra '' is so that
                       # a|b| is split into "a", "b" and "" for instance.
                       # also note that it splits an empty string into one empty
                       # element.

array=("$2" "$3" "$4")
0
27.01.2020, 23:55

Команда bash readможет сохранять поля в массив:

while IFS='|' read -r -a fields; do
    # do stuff with the elements of "${fields[@]}"
done < file
1
27.01.2020, 23:55

Теги

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