Unix Bash содержимое файла в качестве аргумента останавливается на первой строке - PullRequest
0 голосов
/ 22 октября 2018

У меня проблема с чем-то вроде ошибки новичка, но я не могу найти способ найти решение.

У меня есть скрипт bash: log.sh, который:

#!/bin/bash
echo $1 >> log_out.txt

И с файлом, состоящим из имен файлов (взятых из результата «find», имена которых являются filesnames.txt и содержит 53 строки абсолютных путей), я пытаюсь:

./log.sh $(cat filenames.txt)

единственный вывод, который у меня есть в log_out.txt, это первая строка.Мне нужно, чтобы каждая строка обрабатывалась отдельно, так как мне нужно поместить их в аргументы в конвейере с двумя программами.Я проверил:

  • мои строки заканчиваются на / n
  • с использованием простого эха без записи в файл
  • все виды cat filenames.txt или (

Я уверен, что это очень глупая вещь, но я не могу понять, почему я не могу перебрать более одной строки: (

Спасибо

Ответы [ 3 ]

0 голосов
/ 23 октября 2018

Это потому, что ваш ./log.sh $(cat filenames.txt) рассматривается как один аргумент.

while IFS= read -r line; do
 echo "$line";
done < filenames.txt

Редактировать в соответствии с: https://mywiki.wooledge.org/DontReadLinesWithFor

Редактировать # 2:

  • Чтобы сохранить начальные и конечные пробелы в результате, задайте для IFS пустую строку.
  • Вы можете упростить больше и пропустить, используя явную переменную, и использовать значение по умолчанию $REPLY

Источник: http://wiki.bash -hackers.org / commands / builtin / read

0 голосов
/ 23 октября 2018

Вы можете перебирать каждую строку.

#!/bin/bash
for i in $*
do
  echo $i >> log_out.txt
done
0 голосов
/ 23 октября 2018

Вам нужно процитировать команду подстановки.В противном случае $1 будет просто первым словом в файле.

./log.sh "$(cat filenames.txt)"

Вы также должны заключить переменную в сценарий в кавычки, иначе все новые строки будут преобразованы в пробелы.

echo "$1" >> log_out.txt

Если вы хотите обрабатывать каждое слово отдельно, вы можете пропустить кавычки

./log.sh $(cat filenames.txt)

и затем использовать цикл в сценарии:

#!/bin/bash
for word in "$@"
do
    echo "$word"
done >> log_out.txt

Обратите внимание, что это решение работает толькоправильно, когда файл содержит одно слово в строке и в словах нет подстановочных знаков.См. Mywiki.wooledge.org/DontReadLinesWithFor, почему это не обобщается на более сложные строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...