Bash (и другие оболочки Unix), 32 (33) байта
Первая и вторая попытка:
case `echo|od` in *5*)echo B;;*)echo L;;esac # portable
[[ `echo|od` =~ 5 ]]&&echo B||echo L # non-portable
Спасибо Деннису, более короткая версия:
od<<<a|grep -q 5&&echo L||echo B # non-portable
echo|od|grep -q 5&&echo B||echo L # portable
echo
Утилита выводит символ новой строки, с шестнадцатеричным значением 0A
, и никакого другого выводом. Ибо <<<a
это так 61 0A
.
По od
умолчанию утилита интерпретирует входные данные как двухбайтовые слова, дополненные нулями, если число байтов нечетное, и преобразует их в восьмеричное. Это приводит к тому, что выходные данные echo интерпретируются как 0A 00
, которые преобразуются в значения 005000
с прямым порядком байтов или 000012
с прямым порядком байтов. 61 0A
становится 005141
в порядке байтов и 060412
в порядке байтов. Полный выход ода также включает в себя адрес и размер данных означает , что мы не можем использовать 0
, 1
или 2
для испытания.
Команда четко определена, чтобы раскрыть системный порядок. Из стандарта :
Порядок байтов, используемый при интерпретации числовых значений, определяется реализацией, но должен соответствовать порядку, в котором константа соответствующего типа хранится в памяти в системе.
Примечания по совместимости
Я не уверен, что использование echo|od
обратных кавычек без двойных кавычек [что приводит к аргументу из трех слов в case
] поддерживается во всех системах. Я не уверен, что все системы поддерживают сценарии оболочки без завершающей строки. Я в основном уверен, но не на 100% в поведении od с добавлением байта заполнения в системах с прямым порядком байтов. При необходимости echo a
может использоваться для портативных версий. Все скрипты работают в bash, ksh и zsh, а переносимые - в dash.