Класс 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 (начало ввода входного сигнала, конец ввода);
Используйте команду source
.
Например:
#! / usr / bin / env bash production = "liveschool_joe" playchool = "playchool_joe" echo $ playchool
#! / 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 = значение
в командной строке. Все сценарии смогут получить доступ к этому значению.
еще короче, используя точку:
#! / bin / bash. CONFIG_FILE sudo -u wwwrun svn up / srv / www / htdocs / $ production sudo -u wwwrun svn up / srv / www / htdocs / $ playchool
source
, чтобы она понятна?
– Lyle
12 October 2016 в 16:00
в Bash, чтобы вывести какой-то вывод команды вместо файла:
source & lt; (echo vara = 3) # variable vara, который является 3 источником & lt; (grep yourfilter / path / to / yourfile) # исходные конкретные переменные
Используйте команду 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
var1 = 'foo'
export $ (cat config .env | grep -v ^ # | xargs) echo $ var1
Если переменные генерируются и не сохраняются в файл, вы не можете их перенести в источник
. Обманчиво простой способ сделать это:
некоторая команда | xargs
У меня такая же проблема, особенно в 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
(
и `` `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"
Обычно я занимаюсь анализом вместо источника, чтобы избежать сложностей некоторых артефактов в моем файле. Он также предлагает мне способы специально обрабатывать цитаты и другие вещи. Моя главная цель - сохранить все, что приходит после «=», как литерала, даже двойных кавычек и пробелов.
#! / 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}"
Не самый эффективный, но с меньшими файлами работает очень чисто.
некоторая команда | source
не работает ... – Elliot Chance 28 July 2015 в 23:51declare -p
), будет какsomeArray [3] = «abc» [ ! d1] и т. д. ...
– Aquarius Power 26 September 2016 в 21:24