Как прочитать файл свойств через мой скрипт?

Я использую оболочку bash. Я пытаюсь написать сценарий, который будет читать файл свойств, а затем делать некоторые замены в другом файле на основе пар ключ-значение, которые он читает в файле. Так что я

#!/bin/bash file = "/tmp/countries.properties" while IFS='=' read -r key value do echo "${key} ${value}" sed -ie 's/:iso=>"${key}"/:iso=>"${key}",:alpha_iso=>"${value}"/g' /tmp/country.rb done < "$file" 

но когда я запускаю файл, я получаю сообщение об ошибке «Nno такой файл или каталог», несмотря на то, что мой файл существует (я сделал «ls» после проверки).

 localhost:myproject davea$ sh /tmp/script.sh =: cannot open `=' (No such file or directory) /tmp/countries.properties: ASCII text /tmp/script.sh: line 9: : No such file or directory localhost:myproject davea$ localhost:myproject davea$ ls /tmp/countries.properties /tmp/countries.properties 

Что еще мне нужно сделать, чтобы прочитать в моем файле свойств успешно?

  • Извлечь два значения из вывода команды
  • Удалить строки, начинающиеся с #
  • Как читать несколько строк вместо строк
  • Выберите строки, начинающиеся с определенных номеров
  • Добавить кавычки и новый разделитель вокруг слов, разделенных пробелами
  • Как удалить определенные ключи из списка слов?
  • Печать регулярного выражения Sed в файл .txt
  • Как вставить содержимое файла в другой файл перед шаблоном (маркером)?
  • 2 Solutions collect form web for “Как прочитать файл свойств через мой скрипт?”

    Ошибки находятся прямо там:

     =: cannot open `=' (No such file or directory) 

    Что-то пытается открыть файл с именем = , но его не существует.

     /tmp/script.sh: line 9: : No such file or directory 

    Обычно это имя файла перед последним двоеточием, но поскольку оно пустое, кажется, что-то пытается открыть файл с пустым именем.

    Рассмотрим линию:

     file = "/tmp/countries.properties" 

    Это запускает командный file с аргументами = и /tmp/countries.properties . (Оболочке все равно, какие аргументы для команды есть, может быть что-то, что использует знак равенства в качестве аргумента.) Теперь file просто так происходит, как программа, используемая для идентификации типов файлов , и это делает только то. Сначала /tmp/countries.properties открыть = , в результате /tmp/countries.properties ошибка, а затем /tmp/countries.properties , сообщив вам, что это такое:

     /tmp/countries.properties: ASCII text 

    Другой No such file or directory из < $file перенаправления < $file . Поскольку переменной не присвоено значение, перенаправление не будет работать.

    Назначение в оболочке требует, чтобы не было пробела вокруг знака = , поэтому:

     file=/tmp/countries.properties 

    Также здесь:

     sed -ie 's/:iso=>"${key}"/:iso=>"${key}",:alpha_iso=>"${value}"/g' 

    Переменные не расширяются в одинарных кавычках, и у вас есть все вокруг всего второго аргумента, поэтому sed получит литерал ${key} а не содержимое переменной.

    Либо завершите одиночные кавычки, чтобы развернуть переменные, либо просто используйте двойные кавычки для всей строки:

     sed -ie 's/:iso=>"'${key}'"/:iso=>"'${key}'",:alpha_iso=>"'${value}'"/g' sed -ie "s/:iso=>\"${key}\"/:iso=>\"${key}\",:alpha_iso=>\"${value}\"/g" 

    Пытаться:

     file="/tmp/countries.properties" 
    Linux и Unix - лучшая ОС в мире.