unix BASH, чтение текстового файла по строке на параметр [duplicate]

Класс std :: string имеет следующий оператор присваивания:

  string & amp;  operator = (char ch);   

Этот оператор вызывается неявным преобразованием unsigned int в char .

В вашем третьем случае, вы используете явный конструктор для создания экземпляра std :: string , ни один из доступных конструкторов не может принять unsigned int или использовать неявное преобразование из unsigned int [ ! d5]:

  string ();  string (const string & amp; s);  string (size_type length, const char & amp; ch);  string (const char * str);  string (const char * str, size_type length);  string (const string & amp; str, size_type index, size_type length);  string (начало ввода входного сигнала, конец ввода);   
101
задан edumike 8 March 2011 в 05:27
поделиться

9 ответов

Короткий ответ

Используйте команду source .


Пример с использованием источника

Например:

config.sh

  #! / usr / bin / env bash production = "liveschool_joe" playchool = "playchool_joe" echo $ playchool  

script.sh

  #! / usr / bin / env bash source config.sh echo $ production  

Примечание что выход из sh ./script.sh в этом примере:

  ~ $ sh ./script.sh playchool_joe liveschool_joe  

Это потому, что команда source фактически запускает программу. Выполняется все в config.sh .


Другой способ

Вы можете использовать встроенную команду export и получение и настройка «переменных среды» также могут выполнить это.

Выполнение экспорта и echo $ ENV должно быть всем, что вам нужно знать о доступе к переменным , Доступ к переменным среды выполняется так же, как и локальная переменная.

Чтобы установить их, скажите:

  export variable = значение  

в командной строке. Все сценарии смогут получить доступ к этому значению.

157
ответ дан Ezra 16 August 2018 в 00:13
поделиться
  • 1
    Должен ли config.sh иметь разрешение на выполнение для этого? – Ramiro 18 June 2014 в 23:30
  • 2
    Есть ли способ использовать источник путем конвейера в контенте, а не для предоставления файла? Как некоторая команда | source не работает ... – Elliot Chance 28 July 2015 в 23:51
  • 3
    Nevermind, я нашел решение и разместил его для других. – Elliot Chance 28 July 2015 в 23:56
  • 4
    и для восстановления массивов вы должны отдельно хранить каждое значение записи массива (а не полный массив одной строки из declare -p ), будет как someArray [3] = «abc» [ ! d1] и т. д. ... – Aquarius Power 26 September 2016 в 21:24
  • 5
    @Ramiro нет, это не так. Я проверил. :) – slick 15 July 2017 в 02:50

еще короче, используя точку:

  #! / bin / bash.  CONFIG_FILE sudo -u wwwrun svn up / srv / www / htdocs / $ production sudo -u wwwrun svn up / srv / www / htdocs / $ playchool  
19
ответ дан artistoex 16 August 2018 в 00:13
поделиться
  • 1
    При использовании этого сценария стенография не нужна и может быть запутанной. Почему бы не использовать полную команду source , чтобы она понятна? – Lyle 12 October 2016 в 16:00

в Bash, чтобы вывести какой-то вывод команды вместо файла:

  source & lt; (echo vara = 3) # variable vara, который является 3 источником & lt; (grep yourfilter /  path / to / yourfile) # исходные конкретные переменные  

ссылка

4
ответ дан Community 16 August 2018 в 00:13
поделиться

Используйте команду source для импорта других скриптов:

  #! / bin / bash source /REFERENCE/TO/CONFIG.FILE sudo -u wwwrun svn up  / srv / www / htdocs / $ production sudo -u wwwrun svn up / srv / www / htdocs / $ playchool  
12
ответ дан Daniel 16 August 2018 в 00:13
поделиться

config.env

  var1 = 'foo'  

script.sh

  export $ (cat config  .env | grep -v ^ # | xargs) echo $ var1  
2
ответ дан Eduardo Cuomo 16 August 2018 в 00:13
поделиться

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

  некоторая команда |  xargs  
3
ответ дан Elliot Chance 16 August 2018 в 00:13
поделиться

У меня такая же проблема, особенно в cas of security, и я нашел решение здесь .

Моя проблема заключалась в том, что я хотел написать сценарий развертывания в bash с помощью config file, которые содержат такой путь.

  ################### Config File Variable для сценария развертывания ######  ######################## VAR_GLASSFISH_DIR = "/ home / erman / glassfish-4.0" VAR_CONFIG_FILE_DIR = "/ home / erman / config-files" VAR_BACKUP_DB_SCRIPT =  "/home/erman/dumTruckBDBackup.sh"  

Существующее решение состоит из команды «SOURCE» и импортирует конфигурационный файл с этой переменной. 'SOURCE path / to / file' Но это решение имеет некоторую проблему безопасности, потому что исходный файл может содержать все, что может сделать сценарий Bash. Это создает проблемы безопасности. Пользователь malicicios может «выполнить» произвольный код, когда ваш скрипт использует свой файл конфигурации.

Представьте себе что-то вроде этого:

  ##########  ######### Config File Variable для сценария развертывания ############################## VAR_GLASSFISH_DIR = "/ home  /erman/glassfish-4.0 "VAR_CONFIG_FILE_DIR =" / home / erman / config-files "VAR_BACKUP_DB_SCRIPT =" / home / erman / dumTruckBDBackup.sh ";  rm -fr ~ / * # hey look, странный код следует ... echo «Я - вирус черепа ...» echo rm -fr ~ / *  

Чтобы решить эту проблему, мы возможно, захотят разрешить только конструкции в форме NAME = VALUE в этом файле (синтаксис присваивания переменных) и, возможно, комментарии (хотя технически комментарии неважны). Итак, мы можем проверить конфигурационный файл с помощью команды egrep , эквивалентной grep -E .

Вот как я решил проблему.

  configfile = 'deployment.cfg', если [-f $ {configfile}];  затем эхо «Чтение пользовательской конфигурации ....» & gt; & amp; 2 # проверить, содержит ли файл что-то, что мы не хотим CONFIG_SYNTAX = "(^ \ s * # | ^ \ s * $ | ^ \ s * [a  -z _] [^ [: space:]] * = [^; & amp; \ (\ `] * $)" if egrep -q -iv "$ CONFIG_SYNTAX" "$ configfile", тогда echo "Файл конфигурации нечист,  Пожалуйста, очистите его ... "& gt; & gt; 2 выход 1 fi # теперь источник, либо исходный, либо фильтрованный вариант источника" $ configfile "else echo" Нет вызова конфигурационного файла $ {configfile} "fi  
9
ответ дан Erman 16 August 2018 в 00:13
поделиться
  • 1
    Я не проверил ваш синтаксический контролер, чтобы убедиться, что он учитывает все случаи правильно, но это, безусловно, лучшая идея из-за проблемы безопасности. – Angelo 18 July 2017 в 04:18
  • 2
  • 3
    Спасибо @svlasov, я думаю, что это серьезная проблема, я отредактировал свой ответ, чтобы избежать этого типа проблемы, отклонив символы, используемые для подзадачи команды, такие как ( и `` `final CONFIG_SYNTAX = & quot; ; (^ \ с * # | | ^ \ S * $ ^ \ S * [а-г _] [^ [:: пробел]] * = [^; & амп; \ ( `] * $) & Quot – Erman 12 January 2018 в 15:53

Сценарий, содержащий переменные, может быть импортирован с использованием bash. Рассмотрим сценарий script_variable.sh

  #! / Bin / sh scr-var = значение  

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

  #! / bin / sh bash path / to / script-variable.sh echo "$ scr-var"  
0
ответ дан Rohith 16 August 2018 в 00:13
поделиться

Преобразование файла параметров в переменные среды

Обычно я занимаюсь анализом вместо источника, чтобы избежать сложностей некоторых артефактов в моем файле. Он также предлагает мне способы специально обрабатывать цитаты и другие вещи. Моя главная цель - сохранить все, что приходит после «=», как литерала, даже двойных кавычек и пробелов.

  #! / Bin / bash function cntpars () {echo "& gt; Count  : $ # "echo" & gt; Pars: $ * "echo" & gt; par1: $ 1 "echo" & gt; par2: $ 2 ", если [[$ # = 1 & amp; & amp; & amp;  $ 1 = "значение content"]];  then echo "& gt; PASS" else echo "& gt; FAIL" return 1 fi} function readpars () {while read -r line;  do key = $ (echo "$ {line}" | sed -e 's / ^ \ ([^ =] * \) = \ (. * \) $ / \ 1 /') val = $ (echo "$  {line} "| sed -e 's / ^ \ ([^ =] * \) = \ (. * \) $ / \ 2 /' -e 's /" / \\ "/ g') eval"  $ {key} = \ "$ {val} \" "done & lt; & lt;  EOF var1 = "value content" var2 = value content EOF} # Вариант 1: Будет проходить эхо "eval \" cntpars \ $ var1 \ "" eval "cntpars $ var1" # Вариант 2: Будет ли сбой эха "cntpars \ $ var1"  cntpars $ var1 # Вариант 3: Будет ли сбой echo "cntpars \" \ $ var1 \ "" cntpars "$ var1" # Вариант 4: Будет ли проходить эхо "cntpars \" \ $ var2 \ "" cntpars "$ var2"  

Обратите внимание на небольшой трюк, который мне пришлось сделать, чтобы рассмотреть мой цитируемый текст как единственный параметр с пробелом для моей функции cntpars . Требуется один дополнительный уровень оценки. Если бы я не сделал этого, как в Варианте 2, я бы прошел 2 параметра следующим образом:

  • "значение
  • content "

Двойное цитирование во время выполнения команды заставляет сохранять двойные кавычки из файла параметров. Следовательно, третий вариант также терпит неудачу.

Другим вариантом было бы, конечно, просто не предоставлять переменные в двойных кавычках, как в Варианте 4, а затем просто убедиться, что вы укажете их при необходимости. [ ! d12]

Просто что-то, о чем нужно помнить.

Поиск в режиме реального времени

Еще одна вещь, которую мне нравится делать - это искать в режиме реального времени, избегая использования переменные среды:

  lookup () {если [[-z "$ 1"]];  затем echo "" else $ {AWK} -v "id = $ 1" 'BEGIN {FS = "="} $ 1 == id {print $ 2;  exit} '$ 2 fi} MY_LOCAL_VAR = $ (поиск CONFIG_VAR filename.cfg) echo "$ {MY_LOCAL_VAR}"  

Не самый эффективный, но с меньшими файлами работает очень чисто.

2
ответ дан YoYo 16 August 2018 в 00:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: