LINUX.ORG.RU

Вопрос по выводу строки

 , ,


0

1

Как в баше абсолютно точно вывести любую строку?
echo использовать не получится, потому что строка может начинаться на -, а -- в echo не работает.
С printf я дальше printf '%b ' "$@\\n" не разобрался и не знаю на сколько это правильно.
UPD:
нужна поддержка \n и \t символов

★★★★★

Последнее исправление: teod0r (всего исправлений: 1)
Ответ на: комментарий от r3lgar

а как быть если не надо чтобы делало перевод после каждого слова? т.е. у меня строка из нескольких слов состоит

teod0r ★★★★★
() автор топика
Ответ на: комментарий от d_a

cat <<'EOF'
....
EOF

Кавычки тут бессмысленны, так как это константный текст, сделать, скажем переменную вместо 'EOF' уже не получится.

vodz ★★★★★
()
Ответ на: комментарий от teod0r

В баше? Я бы сделал что-то типа

for i in ${@}; do
  printf '%s\n' "${i}"
done
или даже
for i in ${@}; do
  printf '%s' "${i}" | awk '{gsub(" +", "\n"); print}'
done
Вариантов мульон!

r3lgar ★★★★★
()
Последнее исправление: r3lgar (всего исправлений: 1)
Ответ на: комментарий от vodz

Кавычки тут бессмысленны, так как это константный текст, сделать, скажем переменную вместо 'EOF' уже не получится.

Почему, осмысленны, поквоченный таким образом делимитер interpolation в heredoc отключает. Это не очень, впрочем, полезно в контексте исходного вопроса.

d_a ★★★★★
()

echo использовать не получится, потому что строка может начинаться на -

Честно не очень понятно что за проблема с ним,

[d_a@work ~]$ x=-e\ 123; echo "$x"
-e 123

просто позаботиться чтобы оно одним аргументом уехало и всё.

d_a ★★★★★
()

printf '%b ' «$@\\n»

%b то не для этого, чем printf '%s\n' "$1" не подходит?

anonymous
()
Ответ на: комментарий от teod0r

т.е. у меня строка из нескольких слов состоит

а сделать из них одну строку религия запрещает? «$*» / «$a $b $c»

anonymous
()
Ответ на: комментарий от anonymous

а сделать из них одну строку религия запрещает? «$*» / «$a $b $c»

как-то массивом можно попробовать

teod0r ★★★★★
() автор топика
Ответ на: комментарий от aedeph_

echo -n -e -E '-123'

echo -n -e -E '-n' — не работает

teod0r ★★★★★
() автор топика
Ответ на: комментарий от anonymous

а будут работать \n как перевод строки и \t для таба в тексте? они мне нужны

teod0r ★★★★★
() автор топика
Ответ на: комментарий от teod0r

echo '-n'

Что ты заладил c этим n? man echo

-n     do not output the trailing newline
поэтому оно тебе и не выводит твое эхо -n

anonymous
()
Ответ на: комментарий от anonymous

вопрос в том и заключается, какой командой мне вывести текст, который будет начинаться с -n

teod0r ★★★★★
() автор топика
Ответ на: комментарий от teod0r

вопрос в том и заключается, какой командой мне вывести текст, который будет начинаться с -n

Вам же уже подсказали:

echo -n -e -E "$text
"
vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 1)
Ответ на: комментарий от teod0r

ничего не выводит

А внимательнее слабо скопипастить? УМВР. Но для «$@» действительно работать не будет, ибо «$@» спец синтаксис, а не только спец переменная.

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 1)
Ответ на: комментарий от teod0r

и \n и \t не работают, а они мне нужны

В смысле не работают? Вы читать пробовали что вам пишут? -e -E не нужно для работы, но если вам нужно - так вставьте -e

Специально для «$@»

if [ "x${1:0:1}" = x- ]; then
        text=
        for i; do
                text="${text:+$text }$i"
        done
        echo -n -e "$text
"
else
        echo -e "$@"
fi
vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 2)
Ответ на: комментарий от teod0r
~ % /tmp/1.sh "--help -n tiuja;sj"
--help -n tiuja;sj
~ % cat /tmp/1.sh
#!/bin/bash
printf -- "$@\n"

Тебе надо что ли, чтобы ещё и все аргументы разом собирало? Ну пробелы всё равно потеряются, если не экранировать, этого никак не избежать. А так вообще можно так:

#!/bin/bash
a="$@"
printf -- "$a\n"
Psych218 ★★★★★
()
Последнее исправление: Psych218 (всего исправлений: 1)
Ответ на: комментарий от vodz

нет. а где не одной командой рабочий вариант? тот вариант тоже не рабочий, если первый аргумент -e

teod0r ★★★★★
() автор топика
Последнее исправление: teod0r (всего исправлений: 1)
Ответ на: комментарий от teod0r

абсолютно точно вывести
не работают \n и \t

внезапно оказалось, что «абсолютная точность» подразумевает интерпертацию некоторых символов

хозяйкам на заметку: в баше можно $'\n'

anonymous
()
Ответ на: комментарий от teod0r

мой вариант printf '%b ' "$@\\n" не рабочий, когда надо вывести /dev/sd? выводит только printf '%b ' "$@" (без \\n вконце)

teod0r ★★★★★
() автор топика
Последнее исправление: teod0r (всего исправлений: 2)
Ответ на: комментарий от teod0r

а где не одной командой рабочий вариант?

Тот, который вы назвали первым рабочим и упростили до одной команды, вот ваше упрощение и не работает с -e.

vodz ★★★★★
()
Ответ на: комментарий от vodz

да действительно. работает

teod0r ★★★★★
() автор топика

С printf я дальше printf '%b ' «$@\\n» не разобрался и не знаю на сколько это правильно.

Ничего неправильного здесь нет, но литералы все-таки логичнее размещать в форматной строке:

$ s='foo\tbar'
$ printf '%b\n' "$s"
foo	bar

Использовать echo в программах не надо (вообще).

Zmicier ★★★★★
()
Последнее исправление: Zmicier (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.