Привет,
Я пишу простой скрипт bash, который должен разобрать содержимое файла в массив. Записи в файле разделены символами "новой строки" — так что файл будет выглядеть примерно так:
path/to/file
path/to/other/file
Я хотел бы проанализировать содержимое и выполнить итерацию по нему. Мой код в настоящее время выглядит так:
CONTENT=`cat /path/to/text/file.txt`
for PATH in $CONTENT
do
echo $PATH
chmod -R 440 $PATH
fi
Этот код отлично работает с файлом с окончаниями строк UNIX. Однако с текстовым файлом в формате Windows он ужасно тормозит. Оператор "echo $PATH" выдает правильный путь, но chmod не работает, сообщая, что файл не существует. Моя сноровка в том, что окончания строк Windows не обрезаются, поэтому он пытается chmod для пути к файлу, который включает символ новой строки.
Мне нужно, чтобы эта штука работала независимо от того, был ли создан целевой файл с помощью символов новой строки Unix или Windows, но, поскольку я новичок в написании сценариев оболочки, я не совсем уверен, как это сделать.
Я ценю вашу помощь!
решение1
Похоже, вам просто нужно удалить возврат каретки при обработке каждой строки. Самый простой способ — использовать утилиту dos2unix
, но если в вашей системе ее нет или вы не можете ее получить, вы можете сделать похожие вещи с помощью tr
, например:
echo $PATH | tr -d '\r'
Больше идей, таких как использование sed
, доступно наВикипедиявход.
РЕДАКТИРОВАТЬ: Я должен отметить, что $PATH
это не очень хорошее имя переменной, поскольку оно, несомненно, устанавливается средой, и другие программы могут зависеть от его значения. Вам следует рассмотреть возможность изменения его на что-то вроде $CUR_PATH
.
решение2
Я бы просто изменил первую строку скрипта:
CONTENT=$(tr -d \\r < /path/to/text/file.txt)