1

Работа в BASH GNU bash, версия 4.2.25(1) -релиз (x86_64-pc-linux-gnu) под Ubuntu 12.04LTS

У меня проблема с записью содержимого массива в строку, разделенную новыми строками.

Я нашел эту запись (Как мне преобразовать переменную массива bash в строку, разделенную символом новой строки?), Что дало мне большую надежду, что решение было готово. Это отлично работает в командной строке.

$ System=('s1' 's2' 's3' 's4 4 4')
$ var=$( IFS=$'\n'; echo "${System[*]}" )
$ echo -e $var
s1
s2
s3
s4 4 4

Но когда я дословно включаю его в функцию внутри библиотеки, он делает именно то, что делал мой собственный массив, и печатает ...

s1 s2 s3 s4 4 4

В командной строке piping to od подтверждает использование разделителя '\n'

$ echo -e $var | od -ab
0000000   s   1  nl   s   2  nl   s   3  nl   s   4  sp   4  sp   4  nl
        163 061 012 163 062 012 163 063 012 163 064 040 064 040 064 012
          s   1  \n   s   2  \n   s   3  \n   s   4       4       4  \n
0000020

Внутри функции точно такие же операторы вставляют пробел в качестве разделителя '\s'

    0000000   s   1  sp   s   2  sp   s   3  sp   s   4  sp   4  sp   4  nl
            163 061 040 163 062 040 163 063 040 163 064 040 064 040 064 012
              s   1       s   2       s   3       s   4       4       4  \n
    0000020

Это поставило меня в тупик. Как я могу принудительно использовать разделитель '\n' внутри функции?

ДОПОЛНЕНИЕ К ВОПРОСУ для иллюстрации предложенного решения, которое я использовал. В командной строке цитаты не имеют значения (что вводит меня в заблуждение!); либо echo -e $ var, либо echo -e "$ var" выдают правильный вывод, как показано ниже.

s1
s2
s3
s4 4 4

В сценарии кавычки имеют значение! Без кавычек разделитель - пробел (sp/040)

echo -e $var | od -abc
0000000   s   1  sp   s   2  sp   s   3  sp   s   4  sp   4  sp   4  nl
        163 061 040 163 062 040 163 063 040 163 064 040 064 040 064 012
          s   1       s   2       s   3       s   4       4       4  \n
0000020

Внутри скрипта с кавычками разделителем является символ новой строки (nl, 012,\n).

echo -e "$var" | od -abc
0000000   s   1  nl   s   2  nl   s   3  nl   s   4  sp   4  sp   4  nl
        163 061 012 163 062 012 163 063 012 163 064 040 064 040 064 012
          s   1  \n   s   2  \n   s   3  \n   s   4       4       4  \n
0000020

Спасибо за этот опыт обучения и есть ли простое объяснение того, почему командная строка и скрипт ведут себя по-разному?

1 ответ1

0

Вам нужно заключить в кавычки переменную. В противном случае он расширяется сценарием и передается в echo как s1 s2 s3 s4:

System=('s1' 's2' 's3' 's4 4 4')
var=$( IFS=$'\n'; echo "${System[*]}" )
echo -e "$var"

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .