Я читаю текстовый файл построчно, используя цикл while, содержимое которого представляет собой каталоги и имена файлов. Я читаю имена файлов с помощью команды basename. Я хочу проверить, существует ли этот файл в каталоге. Но приведенный ниже код не работает. Когда я повторяю команду basename, она выводит символ ввода вместе с именем файла. Как удалить «введите символ»?

while read line;do
   file=`basename "$line"`
   dir=`dirname "$line"`
   if [ -f "/data/config/${file}" ]; then
    echo "${file} is present"
   fi
done < /data/textfile.txt*

содержание textfile.txt приведено ниже

config/local/common/environment.properties
config/local/common/jmsservices.xml
config/local/common/ejbservices.xml

2 ответа2

0

Это стандартное поведение echo . Со страницы руководства

Утилита echo записывает любые стандартные операнды, разделенные одиночными пустыми (') characters and followed by a newline (\n'), в стандартный вывод.

Вы можете указать -n чтобы избежать добавления новой строки:

 -n    Do not print the trailing newline character.  This may also be achieved by appending `\c' to the end of the string, as is done by iBCS2 compatible systems.  Note that this option
       as well as the effect of `\c' are implementation-defined in IEEE Std 1003.1-2001 (``POSIX.1'') as amended by Cor. 1-2002.  Applications aiming for maximum portability are
       strongly encouraged to use printf(1) to suppress the newline character.
0

На man basename:

NAME
   basename - strip directory and suffix from filenames 
...
   -z, --zero
          end each output line with NUL, not newline

Если вы решите использовать -z , оболочка может пожаловаться на NUL, то есть вам, возможно, придется отправить поток ошибок в /dev/null.

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