4

Вот мой bash-скрипт, который отправляет переменную из php:

STRING1="/opt/lampp/htdocs/dev/img/$VAR1"
mv $STRING1 "/opt/lampp/htdocs/dev/newlocation/"

По какой-то причине он помещает «\r» в конце $ STRING1 и не может найти файл, потому что он будет иметь вид «my_picture.jpg\r»

Любая помощь приветствуется!

3 ответа3

6

Bash ожидает, что конец строки в скрипте - это всегда и только символ новой строки (\n) в стиле Unix, а не сочетание возврата каретки-новой строки (\r\n), как вы обычно видите в Windows. Bash считает, что символ \r - это обычный символ в конце строки. (Символы, следующие за строкой в двойных кавычках, просто объединяются в конце.)

Как подсказывает Игнасио, решение состоит в том, чтобы исправить ваш скрипт, чтобы исключить символы \r. dos2unix это один из способов. Другой вариант - использовать tr -d '\r' < infile > outfile в качестве фильтра.

5

Передайте скрипт через dos2unix чтобы исправить новые строки.

1

Это очевидно для целей других гуглеров, таких как я, а не ОП, видя, что прошло более 5 лет. Но это решение существовало и тогда.

Вы можете попробовать замену bash, чтобы убрать самый большой шаблон из конца строки, который выглядит как $ {varname %% pattern}, подробнее здесь:

http://tldp.org/LDP/abs/html/string-manipulation.html

Это должно быть быстрее, чем порождать другой процесс, такой как tr, для его обработки.

VARNAME=$'a_bad_filename\r' VARNAME="${VARNAME%%[[:cntrl:]]}"

Вот ссылка на строго ограниченное сопоставление с шаблоном bash (на самом деле это не регулярное выражение, а скорее выражение "like" или "glob"). Что касается того, почему возврат каретки находится в классе управления, а не в классе пробелов, я не уверен. Это считается пробелом в других языках. Без включения расширенного сопоставления с образцом с помощью «shopt -s extglob», нет никакого способа указать простую конструкцию, например, "этот символ повторяется 0 или более раз" в bash. Я также нашел

printf "%q" "${VARNAME}"

.. в дополнение к "set -vx", чтобы показать / проверить возврат каретки.

Я сталкивался с этой проблемой при использовании Cygwin Bash против вывода из стандартной (не Cygwin) версии Python; Я не понимаю, почему я не вижу больше о том, как это решить.

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