Индексный диапазон массива не позволяет вам выполнять итерации по новой строке в ударе

Я нашел ответы. (Спасибо участнику форума и g+community)

Эта проблема из-за cURL, curl использует ipv6 для подключения к вашим репозиториям, поэтому вам нужно настроить curl на использование ipv4.

Нам нужно отредактировать файл systl.conf.

sudo vim /etc/sysctl.conf 

добавьте следующие строки :-

 net.ipv6.conf.all.disable_ipv6 = 1

 net.ipv6.conf.default.disable_ipv6 = 1

 net.ipv6.conf.lo.disable_ipv6 = 1 

также отредактируйте

sudo vi /proc/sys/net/ipv6/conf/all/disable_ipv6

замените 0 на 1

и обновите репозитории

sudo zypper refresh
2
16.12.2018, 23:48
2 ответа

Вкратце:вы должны использовать кавычки вокруг расширений массива таким образом, если вы явно не хотите разбивать поле/слово. "$@"расширяет каждый позиционный параметр до отдельного слова, и аналогично "${a[@]}". Кроме того, это должно работать так же для "${a[@]:0:2}".


Тем не менее, это все еще кажется несоответствием в Bash, и то, что вы использовали, должно работать в вашем случае (, так как в значениях нет символов глобуса, а разделение полей обеспечивается установкой IFSправильно ).

Полный массив работает:

$ IFS=$'\n'
$ a=("foo bar" "asdf ghjk")
$ printf "%s\n" ${a[@]}
foo bar
asdf ghjk

Нарезка не работает для массива, но работает для$@:

$ printf "%s\n" ${a[@]:0:2}
foo bar asdf ghjk

$ set -- "aa bb" "cc dd"
$ printf "%s\n" ${@:1:2}
aa bb
cc dd

Это работает в ksh и zsh, что как бы подчеркивает непоследовательность Bash здесь(zsh, конечно, будет иметь свой собственный синтаксис для эквивалента):

$ ifs=$'\n' ksh -c 'IFS="$ifs"; a=("foo bar" "asdf ghjk"); printf "%s\n" ${a[@]:0:2}'
foo bar
asdf ghjk
$ ifs=$'\n' zsh -yc 'IFS="$ifs"; a=("foo bar" "asdf ghjk"); printf "%s\n" ${a[@]:0:2}'
foo bar
asdf ghjk

Версия в кавычках работает и в Bash, и она лучше, когда вам нужны значения как -, так как вам не нужно зависеть от IFS.Значение по умолчанию IFSздесь работает нормально, даже несмотря на то, что элементы массива содержат пробелы :

.
$ unset IFS                         # uses default of $' \t\n'
$ printf "%s\n" "${a[@]:0:2}"
foo bar
asdf ghjk

Похоже, что ${a[@]:0:2}без кавычек соединяет элементы пробелами, что немного похоже на то, что происходит в Bash в контекстах, где разбиение слов -не происходит (, например.str=${a[@]}). А затем пытается разделить результат на IFS, как обычно. Например. здесь он разбивается на новую строку в середине второго элемента массива:

$ IFS=$'\n'
$ a=("foo bar" $'new\nline' "asdf ghjk");
$ printf ":%s\n" ${a[@]:0:3}
:foo bar new
:line asdf ghjk

Как было сказано выше, в большинстве случаев вам действительно следует использовать кавычки вокруг расширений массива, хотя все же можно предположить, что ${a[@]:n:m}приведет к нескольким словам, как это делает ${a[@]}.

Поведение здесь похоже присутствует в Bash 4.4.12(1)-releaseи 5.0.0(1)-alpha. Я опубликовал отчет об ошибке.

3
27.01.2020, 21:55

цитата
цитата

Цитата

Цитата

Цитата!!

Это работает:

$ game_array=("foo bar" "baz" "bam foo" "bar")

$ for game in "${game_array[@]:0:10}" ; do echo "$game"; done
foo bar
baz
bam foo
bar
2
27.01.2020, 21:55

Теги

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