С некоторыми cut
реализациями, такими как GNU cut
, вы можете сделать:
cut -b 1-./*.text > output
, так как он добавит отсутствующую новую строку, если она отсутствует.
FILE=`cat test.txt`
сохраняет содержимое файла (, за исключением завершающих символов новой строки )в переменной FILE
. Затем echo "$FILE"
выводит содержимое файла (, предполагая, что оно не начинается с тире и не содержит обратной косой черты ). Было бы проще прямо написать
for i in `cat test.txt`
Далее, подстановка команды `…`
в контексте, допускающем разбиение на слова, разбивает вывод команды на слова, а не на строки.(Это значение по умолчанию, и его можно изменить, хотя это не лучший способ решить вашу проблему. )Это ваша очевидная проблема :цикл выполняется один раз для каждого слова, а не один раз для каждой строки. Кроме того, слова обрабатываются как шаблон оболочки :, если есть строка, подобная test * source=a=b=c
, *
будет заменена списком имен файлов в текущем каталоге.
Использование awk для извлечения полей из строк работает (за исключением искажения из echo
), но это слишком сложно и медленно.
Есть встроенная оболочка, которая считывает строку и разбивает ее на поля:read
. Просто используйте это. Чтобы использовать символ =
в качестве разделителя полей, установите переменную IFS
для команды read
. Передайте параметр -r
в read
, если вы не хотите рассматривать обратную косую черту в конце строки как указание на продолжение строки.
while IFS='=' read -r DS_NAME HOST_NAME PORT_NUMBER DB_NAME ignored; do
…
done <test.txt
Дополнительная переменная ignored
делает ваш синтаксический анализатор более надежным в случае наличия дополнительного поля, например.
test connection data source=test.connect.com=1234=testdb=hey, a new field