Зацикливание содержимого файла построчно в BASH

#bash #shell #terminal

#bash #оболочка #терминал

Вопрос:

У меня есть файл под названием installer.txt который будет содержать построчные URL-адреса .tar.gz файлы, подобные:

 http://oscargodson.com/projects/example1.tar.gz
http://oscargodson.com/projects/anotherexample.tar.gz
http://oscargodson.com/projects/onemore.tar.gz 
  

И я попытался:

 #!/bin/bash
file = `cat installs.txt`
for word in file; do
  echo $word
done
  

Но мой вывод выглядит так:

 Oscars-MacBook-Air:Desktop oscargodson$ ./test.sh
=:                                                     cannot open `=' (No such file or directory)
http://oscargodson.com/projects/example1.tar.gz:       cannot open `http://oscargodson.com/projects/example1.tar.gz' (No such file or directory)
http://oscargodson.com/projects/anotherexample.tar.gz: cannot open `http://oscargodson.com/projects/anotherexample.tar.gz' (No such file or directory)
http://oscargodson.com/projects/onemore.tar.gz:        cannot open `http://oscargodson.com/projects/onemore.tar.gz' (No such file or directory)
file
  

Он должен выводить каждую строку, или, так я думал. Идеи?

Ответ №1:

Ваши ошибки на самом деле генерируются оператором присваивания. У вас не может быть пробелов вокруг вашего назначения. И рекомендуется всегда заключать rhs в кавычки. Итак, что вы хотите, это

 #!/bin/bash -u
file="$(cat installs.txt)"
for word in $file; do
  echo $word
done
  

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

Комментарии:

1. Спасибо. Исходя в основном из фона JavaScript и некоторых rails, этот синтаксис довольно странный для меня 🙂

2. Он также пропускал $ при использовании file — Я вижу, вы это тоже исправили.

3. Кроме того, что означает -u в shebang? Погуглил, но безрезультатно.

4. -u Означает, что скрипт выдаст ошибку, если вы ссылаетесь на неустановленную переменную. Очень полезно для обнаружения опечаток. например, если у вас случайно получилось echo $wrod , было бы просто напечатать пустые строки. Но с -u это напечатало бы сообщение об ошибке, в котором говорится, что wrod это неопределенная переменная