float=$( openstack floating ip list -c 'Floating IP Address' -f value )
Это подстановка командвнутри обычного присвоения переменной, а не присвоение массива. Все назначения составного массива имеют форму
x=( ... )
, как вы использовали ниже. Здесь нет подоболочки (кроме краткого контекста выполнения подставляемой команды).Когда вы используете подстановку команд, она ведет себя так же, как переменная с этим содержимым в этой позиции, и аналогично с
float=$x
здесь, а также сls $ x
илиfoo=($x)
. Разбиение словвыполняется по результату расширения, которое разделяет значение на отдельные аргументы по любому символу в переменнойIFS
.Вы можете подавить разделение слов, заключив в кавычки расширение
"$(...)"
.Если вы хотите создать массив разделенных слов, вам нужно обадля создания массива и разделения слов: это означает присвоение массива
foo=(...)
и подстановка параметра или команды$...
в сочетании, как в вашем втором случае:float=( $( openstack floating ip list -c 'Floating IP Address' -f value ) )
The
float=(...)
создает массив, а элементы происходят из-за разделения слов, выполняемого во время подстановки команды$(...)
.Что может сбивать с толку, так это то, что Bash автоматически преобразует немассивы в одноэлементные массивы, когда вы используете их как единое целое, поэтому похоже, что вы получили массив, но из одного элемента.
echo ${float[0]} echo ${#float[@]}
Это очень тонко задокументировано:
Любая ссылка на переменную с допустимым нижним индексом допустима, и bash при необходимости создаст массив.
Вы увидите это более четко, если воспользуетесь другим индексом:
float[1]=abc echo ${#float[@]} # => 2
Процесс преобразования просто использует существующее значение переменной, если оно есть, в качестве элемента с индексом 0 в массиве.
Из-за документации:The -w flag has no effect on the -l option, i.e. nc will listen forever for a connection, with or without the -w flag
Пробовал nc
ncat
socat
, никто не может установить таймаут для режима сервера.
Насколько мне известно, только busybox nc
может следовать за опцией -w
в режиме сервера.
Таким образом, вам нужно скачать busybox, скомпилированный с опцией CONFIG_NC_SERVER=y
, или скомпилировать его самостоятельно.
Чтобы ты мог
$busybox nc -w 10 -l -p 9999
Но Busybox моей системы не компилировался с параметром CONFIG_NC_SERVER=y
, и я не хочу его компилировать. Поэтому я использую это решение:
portnum=9999
(sleep 10 ;echo "T" | nc -w 1 127.0.0.1 $portnum) | nc -N -l -p $portnum
Через 10 секунд отправьте «T» на локальный хост :9999
Полный код
#!/bin/sh
portnum=9999
testmsg="Hello_World"
if [ "$( (sleep 10 ;echo "T" | nc -w 1 127.0.0.1 $portnum) | nc -N -l -p $portnum )" = $testmsg ]; then
echo "Test pass"
else
echo "Test not pass"
fi
Если сервер получил Hello_World
через 10 секунд, он напечатает Test pass
. В противном случае выведитеTest not pass
Вы можете попробовать открыть другую консоль и ввести
echo "Hello_World" | nc -w 1 127.0.0.1 9999
, чтобы проверить это.
Как заявил peterph , тайм-аут(-w
)при прослушивании(-l
)соединений работает (только )с традиционными nc
реализациями.
В Ubuntu такую реализацию можно установить с помощью apt install netcat-traditional
и вызвать с помощью nc.traditional
.