У меня есть строка, которая является результатом какой-то операции, которую я не могу контролировать. Когда я печатаю эту переменную используя echo
, я получаю:
echo $myvar
hello
Тем не менее, когда я делаю
if [ $myvar = "hello" ]; then
echo they are equal
else
echo they are not equal
fi
Я всегда понимаю, что они не равны. Я подозреваю, что это из-за newline
характера.
Строка также ведет себя странно. Когда я делаю:
newVAR="this is my var twice: "$myvar$myvar
echo $newVAR
Я получил:
hellois my var twice: hello
Как я могу проверить, действительно ли это происходит из-за a, newline
и, если да, удалить его?
printf '%q\n' "$string"
получить экранированную версию любой строки. Например:printf '%q\n' 'foo\n'
->foo\\n
;printf '%q\n' $'foo\n'
->$'foo\n'
echo $foo
. Делайecho "$foo"
вместо этого.Ответы:
Проблема в том, что у вас есть встроенный возврат каретки (CR,
\r
). Это приводит к тому, что точка вставки текста терминала возвращается к началу строки, которую она печатает. Вот почему вы видите «привет» в начале строки в вашем$newVAR
примере -sed -n l
отображает читаемое представление непечатаемых символов (и конец строки).Вы можете проверить это с помощью простой проверки состояния bash:
Вы можете объединить тестирование и исправление за один шаг, проверив
\r
(ы) и удалив их с помощью:Затруднительное использует Shell Параметр Expansion . Конкретная форма, использованная выше, предназначена для замены подстрок на основе вашего предоставленного шаблона:
${parameter/pattern/string}
<- это заменяет только первый найденный шаблон на строку в переменной с именем * параметр. Чтобы заменить все шаблоны, вам просто нужно изменить первый/
на//
.источник
fix="....
линия?fix
может бытьvar
само по себе - или часто вы можете просто использовать расширение параметра как есть, без необходимости переназначать (возможно) измененное значение ..Вы можете представить
\r
как$'\r'
в bash:Или нарезать последний
\r
вmyvar
:источник
Любопытно, что во многих снарядах
getopts
очень вероятный кандидат на такую работу. Поначалу это может показаться нелогичным, но если учесть, чтоgetopts
«основная функция заключается в распознавании и предложении для интерпретации стольких заданных односимвольных параметров командной строки, сколько может быть найдено в объединенной серии одинаковых, это может привести к некоторому больше смысла.Для демонстрации из
bash
оболочки:Таким образом, иногда бывает удобно разрешить
getopts
обрабатывать разборку как своего рода автопилот в таких случаях. Когда вы сделаете это, вы можете просто отфильтровать нежелательные байты с помощьюcase
или[
протестировать]
и создать резервную копию строки из байта 1:Учитывая этот простой пример, а также оболочку, которая поддерживает раскрытие параметров, уже упоминавшееся в другом месте, указанные расширения, вероятно, будут вам здесь полезнее. Но я подумал,
getopts
что стоит также упомянуть, если вы не знаете о его возможностях в этом отношении. Конечно, когда я узнал об этом, я нашел много полезных приложений для него, так или иначе.источник
Хотя Bash и другие языки оболочки удобны, иногда лучше использовать настоящий язык сценариев, такой как Perl. Perl может легко заменить сценарии оболочки, которые вызывают другие языки, такие как sed и awk, а также команды UNIX. Я узнал об этом 20 с лишним лет назад, когда писал сценарии C-Shell, которые в свою очередь называли sed, awk и различные команды UNIX, прежде чем вызывать код FORTRAN. В Perl я бы сделал:
источник