Проблемы, вытекающие переменную при использовании echo

Вы можете принять решение на основе вывода службы rtvscand status :

[ "$(service rtvscand status)" = 'rtvscand is running' ] && do_what_you_want

Это означает, что если вывод rtvscand работает , то это rtvscand is running тогда мы сделаем кое-что, иначе нет.

Таким образом, ваш сценарий может иметь вид:

while IFS= read -r name; do
   ssh root@"$name" '[ "$(service rtvscand status)" = "rtvscand is running" ] && \
                      { uname -n; cat /opt/Symantec/virusdefs/definfo.dat ;}'
done <list.txt
1
10.09.2018, 10:39
2 ответа
Синтаксис

echoотличается от стандартных escape-последовательностей C, поддерживаемых printf/ awk/ $'...'...

В стандартном синтаксисе echoвам нужен начальный 0перед восьмеричной последовательностью (, которая может содержать от 1 до 3 цифр )¹:

echo '\0360\0237\0246\0204'

Обратите внимание: чтобы встроенная функция bashechoработала с этим, необходимо включить параметр xpg_echo²:

$ UNICORN_utf8_printf_format='\360\237\246\204'
$ UNICORN_utf8_echo='\0360\0237\0246\0204'
$ UNICORN_utf8=$'\360\237\246\204'
$ printf "$UNICORN_utf8_printf_format\n"

$ printf '%s\n' "$UNICORN_utf8"

$ shopt -s xpg_echo
$ echo "$UNICORN_utf8_echo"

Выше только $UNICORN_utf8содержит символ, закодированный в UTF8. Другие содержат последовательности обратной косой черты и цифр, которые должны быть расширены соответствующими инструментами.

Формат %bутилиты printfтакже понимает те же последовательности, что и echo. %bбыл фактически добавлен, чтобы мы могли избавиться от echo, который невозможно использовать портативно и надежно .

$ printf '%b\n' "$UNICORN_utf8_echo"

См. также (в zshи bash³):

UNICORN_locale_encoding=$'\U1f984'

Что дает вам Единорога, закодированного в кодировке локали, что заставит его работать, даже если кодировка локали не была UTF -8, а также имел этот символ (, вероятно, только GB18030, где кодируется как $'\225\60\330\66'и где $'\360\237\246\204'будет кодировкой馃(\N{CJK UNIFIED IDEOGRAPH-9983}\N{<private use area-E6E9>})).

Некоторые printfреализации (, включая GNU printfи printf, встроенные в zsh, ksh93и последние версииbash(4.2 или выше )), также поддерживают эти \UXXXXXXXXescape-последовательности. последовательности в их аргументе формата (или аргументы для %b, за исключением ksh93 ); GNU нужно 8 цифр.


¹ GNU coreutils echoи busybox echoподдерживают \oooс -eв качестве расширения (, но не тогда, когда POSIXLY_CORRECTнаходится в среде для GNUecho)

² другим вариантом может быть использование нестандартной -опции -e, но тогда она не будет работать, когда включены обе опции posixи xpg_echo, например, когда bashв UNIX режим соответствия.

³ ksh93 и mksh также поддерживают этот синтаксис, но кодируются в UTF -8 независимо от кодировки локали; в текущих (2018 )версиях FreeBSD shвам нужно \U0001f984, и это работает только в UTF -8 локалях.

9
27.01.2020, 23:11
$ echo $'\360\237\230\200\012'

(это bashecho, GNU bash, версия 4.3.43 (1 )-выпуск (x86 _64 -redhat -linux -gnu))

Или вы можете использовать двоичный файл echo:

$ /usr/bin/echo -e "\360\237\230\200\012"

Откуда я это взял? Я использовал ответ maulinglawns выше, чтобы увидеть восьмеричный смайлик:

$ printf "\U1F600\n"

$ printf "\U1F600\n"|hexdump -b
0000000 360 237 230 200 012                                            
0000005

hexdump:
-b, --one-byte-octal one-byte octal display

РЕДАКТИРОВАТЬ:Если вам нужен смайлик единорога:

$ echo $'\360\237\246\204'

$ `which echo` -e '\360\237\246\204'

Если вам нужен общий способ получения восьмеричного числа в этом формате:

printf "\U1F600\n"|hexdump -v -e '"\\" 1/1 "%03o"' ; echo
\360\237\230\200\012

Выходные данные включают \nкак \012. «;echo» добавит новую строку в конце, это полезно при попытке выполнить это в командной строке, иначе приглашение оболочки будет отображаться сразу после вывода.

3
27.01.2020, 23:11

Теги

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