Добавление текста к каждому элементу массива

Проверьте, есть ли у вас DNS-серверы в /etc/resolv.conf , и, если нет, добавьте хотя бы один.

Пример

#check dns servers
> cat /etc/resolv.conf
nameserver 8.8.8.8

#add one dns server
> echo nameserver 8.8.4.4 >> /etc/resolv.conf

#check dns servers again
> cat /etc/resolv.conf
nameserver 8.8.8.8
nameserver 8.8.4.4

Обратите внимание, что адреса, указанные выше, являются лишь примером, они не будут работать в вашей системе. Обратитесь к документации вашего VPS-провайдера, чтобы узнать, какие у них DNS-серверы.

2
08.03.2019, 22:30
2 ответа

Лучший ответ зависит от того, для чего вам нужен модифицированный массив.

  1. Если вы создаете аргументы строки команды -(, как в вопросе ), и , вы используете инструмент, который принимает такие флаги, как --file=foo, в качестве альтернативы --file foo, наиболее идиоматичным подходом является использование ${^name}формы расширения:

    $ items=(foo "two words" baz)
    $ print -lr -- --file=${^items}
    --file=foo
    --file=two words
    --file=baz
    

    Я использую print -lr, чтобы продемонстрировать, что расширение создает массив из трех элементов. Если вы вызовете такую ​​команду, команда увидит три аргумента.

  2. Если вы создаете аргументы строки команды -, вы можете поместить текст перед(--fileв этом примере )в фиктивный массив и объединить его с массивом аргументов, используя форму расширения ${name:^^arrayname}:

    $ flag=(--file)
    $ items=(foo "two words" baz)
    $ print -lr -- ${flag:^^items}
    --file
    foo
    --file
    two words
    --file
    baz
    

    Это массив из шести элементов. Либо этот формат, либо тот, что в (1 )— или оба — должны быть приемлемы практически для любого инструмента командной строки -для передачи флагов со связанными значениями.

  3. Вы можете изменить подход в (1 ), чтобы использовать пробел вместо знака равенства:

    $ items=(foo "two words" baz)
    $ print -lr -- --file\ ${^items}
    --file foo
    --file two words
    --file baz
    

    (Обратите внимание, что у вас есть для выхода из пробела с помощью обратной косой черты; использование двойных кавычек, таких как "--file ${^items}", означает что-то еще. )Это массив из трех элементов, но со встроенным пробелом в каждом элементе. Немногие инструменты командной строки, если таковые имеются, будут принимать флаги в этом формате, но это может быть полезно для других видов манипуляций с текстом.

  4. Вы также можете использовать форму расширения ${name/pattern/repl}. Шаблон должен начинаться с #(, чтобы указать, что он должен соответствовать в начале каждого элемента массива ), но в противном случае он должен быть пустым (, чтобы каждый элемент массива совпадал и чтобы фактически не заменялся текст ).

    $ items=(foo "two words" baz)
    $ print -lr -- ${items/#/--file }
    --file foo
    --file two words
    --file baz
    

    Здесь те же оговорки, что и в (3 ), а также он менее идиоматичен, чем этот подход.

Обратите внимание, что все четыре из этих подходов будут работать правильно (, т. е. они не будут внезапно разбивать строки на пробелы ), когда элементы массива содержат пробелы.

5
27.01.2020, 21:52

Вы можете сделать это переносимо (или, по крайней мере, переносимо на оболочки, которые поддерживают этот синтаксис массива )с помощьюprintf:

$ items=(foo bar baz)
$ printf -- "--file %s " "${items[@]}"
--file foo --file bar --file baz $ 

Однако, в отличие от команды print, она не добавляет завершающую новую строку (, поэтому у вас есть $в той же строке, что и вывод, над ). Если это нарушает условия сделки, вы можете:

$ printf -- "--file %s " "${items[@]}"; echo ""
--file foo --file bar --file baz 
1
27.01.2020, 21:52

Теги

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