Поддерживает ли ваш адаптер Wi-Fi несколько управляемых интерфейсов? Проверьте строку «допустимые комбинации интерфейсов» в iw phy
.
Не используйте устройство смены MAC-адресов, установите MAC-адрес при добавлении интерфейса(iw dev <devname> interface add... addr <mac-addr>
).
Многочисленные интерфейсы с разными IP-адресами — это головная боль, потому что каждая используемая вами программа должна иметь возможность привязываться к одному интерфейсу, и даже в этом случае могут быть сюрпризы, поэтому убедитесь, что вы запускаете как dhclient
, так и wpa_supplicant
только на том интерфейсе, который в этом нуждается.
Если это по-прежнему не работает, отредактируйте вопрос, указав точные команды, которые вы использовали (для всех интерфейсов ).
Если вы хотите передать|
-разделенные данные и сохранить их в массиве 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
#!/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
Разделение в 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")
Команда bash read
может сохранять поля в массив:
while IFS='|' read -r -a fields; do
# do stuff with the elements of "${fields[@]}"
done < file