Скрипт Bash - Как ссылаться на файл для переменных

Здравствуйте, я хочу вызвать файл настроек для переменной, как я могу это сделать в bash?

Таким образом, файл настроек определит переменные (например, CONFIG.FILE):

production="liveschool_joe"
playschool="playschool_joe"

И сценарий будет использовать эти переменные в нем

#!/bin/bash
production="/REFERENCE/TO/CONFIG.FILE"
playschool="/REFERENCE/TO/CONFIG.FILE"
sudo -u wwwrun svn up /srv/www/htdocs/$production
sudo -u wwwrun svn up /srv/www/htdocs/$playschool

Как я могу заставить bash сделать что-то подобное? Должен ли я использовать awk /sed и т. Д.?

113 голосов | спросил edumike 8 MaramTue, 08 Mar 2011 07:27:52 +03002011-03-08T07:27:52+03:0007 2011, 07:27:52

10 ответов


0

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

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


Пример использования source

Например:

config.sh

#!/usr/bin/env bash
production="liveschool_joe"
playschool="playschool_joe"
echo $playschool

script.sh

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

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

~$ sh ./script.sh 
playschool_joe
liveschool_joe

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


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

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

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

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

export variable=value

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

ответил Ezra 8 MaramTue, 08 Mar 2011 07:50:46 +03002011-03-08T07:50:46+03:0007 2011, 07:50:46
0

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

#!/bin/bash
. CONFIG_FILE

sudo -u wwwrun svn up /srv/www/htdocs/$production
sudo -u wwwrun svn up /srv/www/htdocs/$playschool
ответил artistoex 8 MarpmTue, 08 Mar 2011 12:45:05 +03002011-03-08T12:45:05+03:0012 2011, 12:45:05
0

Используйте команду 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/$playschool
ответил Daniel 8 MaramTue, 08 Mar 2011 07:34:55 +03002011-03-08T07:34:55+03:0007 2011, 07:34:55
0

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

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

################### Config File Variable for deployment script ##############################

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 путь /к /файлу' Но у этого решения есть некоторая проблема безопасности, потому что исходный файл может содержать все, что может сценарий Bash. Это создает проблемы безопасности. Специалист по malicicios может «выполнить» произвольный код, когда ваш скрипт использует свой конфигурационный файл.

Вообразите что-то вроде этого:

 ################### Config File Variable for deployment script ##############################

    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, weird code follows...
    echo "I am the skull virus..."
    echo rm -fr ~/*

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

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

configfile='deployment.cfg'
if [ -f ${configfile} ]; then
    echo "Reading user config...." >&2

    # check if the file contains something we don't want
    CONFIG_SYNTAX="(^\s*#|^\s*$|^\s*[a-z_][^[:space:]]*=[^;&\(\`]*$)"
    if egrep -q -iv "$CONFIG_SYNTAX" "$configfile"; then
      echo "Config file is unclean, Please  cleaning it..." >&2
      exit 1
    fi
    # now source it, either the original or the filtered variant
    source "$configfile"
else
    echo "There is no configuration file call ${configfile}"
fi
ответил Erman 22 MarpmTue, 22 Mar 2016 23:47:08 +03002016-03-22T23:47:08+03:0011 2016, 23:47:08
0

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

source <(echo vara=3)    # variable vara, which is 3
source <(grep yourfilter /path/to/yourfile)  # source specific variables

ссылка

ответил zhazha 19 SatEurope/Moscow2015-12-19T06:44:07+03:00Europe/Moscow12bEurope/MoscowSat, 19 Dec 2015 06:44:07 +0300 2015, 06:44:07
0

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

some command | xargs
ответил Elliot Chance 29 J000000Wednesday15 2015, 02:55:44
0

config.env

var1='foo'

script.sh

export $(cat config.env | grep -v ^# | xargs)
echo $var1
ответил Eduardo Cuomo 13 +03002016-10-13T22:52:49+03:00312016bEurope/MoscowThu, 13 Oct 2016 22:52:49 +0300 2016, 22:52:49
0

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

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

#!/bin/bash

function cntpars() {
  echo "  > Count: $#"
  echo "  > Pars : $*"
  echo "  > par1 : $1"
  echo "  > par2 : $2"

  if [[ $# = 1 && $1 = "value content" ]]; then
    echo "  > PASS"
  else
    echo "  > 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 << EOF
var1="value content"
var2=value content
EOF
}

# Option 1: Will Pass
echo "eval \"cntpars \$var1\""
eval "cntpars $var1"

# Option 2: Will Fail
echo "cntpars \$var1"
cntpars $var1

# Option 3: Will Fail
echo "cntpars \"\$var1\""
cntpars "$var1"

# Option 4: Will Pass
echo "cntpars \"\$var2\""
cntpars "$var2"

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

    "value литий> content" литий>

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

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

Просто кое-что, чтобы иметь в виду.

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

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

lookup() {
if [[ -z "$1" ]] ; then
  echo ""
else
  ${AWK} -v "id=$1" 'BEGIN { FS = "=" } $1 == id { print $2 ; exit }' $2
fi
}

MY_LOCAL_VAR=$(lookup CONFIG_VAR filename.cfg)
echo "${MY_LOCAL_VAR}"

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

ответил YoYo 17 42016vEurope/Moscow11bEurope/MoscowThu, 17 Nov 2016 06:44:25 +0300 2016, 06:44:25
0

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

#!/bin/sh
scr-var=value

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

 #!/bin/sh
 bash path/to/script-variable.sh
 echo "$scr-var"
ответил Rohith 27 J000000Thursday17 2017, 05:39:30
0
#! /bin/bash
#  (GPL3+) Alberto Salvia Novella (es20490446e)


variableInFile () {
    variable=${1}
    file=${2}

    source ${file}
    eval value=\$\{${variable}\}
    echo ${value}
}


variableInFile ${@}
ответил Alberto Salvia Novella 18 Jpm1000000pmFri, 18 Jan 2019 13:50:03 +030019 2019, 13:50:03

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132