বাশ ব্যবহার করে ভেরিয়েবলের জন্য কোনও ফাইলকে কীভাবে রেফারেন্স করবেন?


151

আমি একটি ভেরিয়েবলের জন্য একটি সেটিংস ফাইল কল করতে চাই, আমি কীভাবে এটি ব্যাশ করতে পারি?

সুতরাং সেটিংস ফাইলটি ভেরিয়েবলগুলি সংজ্ঞায়িত করবে (উদাহরণস্বরূপ: কনফিগ.ফিল):

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

এমন কিছু করার জন্য আমি কীভাবে বাশ পেতে পারি? আমাকে কি কর্কট / সেড ইত্যাদি ব্যবহার করতে হবে ...?

উত্তর:


241

সংক্ষিপ্ত উত্তর

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

কমান্ড লাইনে সমস্ত স্ক্রিপ্ট এই মানটি অ্যাক্সেস করতে সক্ষম হবে।


কনফিগারেশনের কাজ করার জন্য অনুমতিটি প্রয়োগ করা উচিত?
রামিরো

2
sourceফাইল সরবরাহের পরিবর্তে সামগ্রীতে পাইপিংয়ের মাধ্যমে কী কী ব্যবহার করার উপায় আছে ? লাইক some command | sourceকাজ করে না ...
এলিয়ট চান্স

1
কিছু মনে করি না, আমি সমাধানটি খুঁজে পেয়েছি এবং এটি অন্যদের জন্য পোস্ট করেছি।
এলিয়ট চান্স

এবং অ্যারেগুলি পুনরুদ্ধার করতে, আপনাকে প্রতিটি অ্যারের প্রবেশ মূল্য পৃথকভাবে সংরক্ষণ করতে হবে (সম্পূর্ণ অ্যারে একক লাইন নয় declare -p), এমন হবে someArray[3]="abc"এবং এই জাতীয় ...
কুম্ভ বিদ্যুৎ

1
@ রমিরো না এটি হয় না। আমি চেক করেছি. :)
ম্যাট কোমরনিকি

22

এমনকি বিন্দু ব্যবহার করে আরও খাটো:

#!/bin/bash
. CONFIG_FILE

sudo -u wwwrun svn up /srv/www/htdocs/$production
sudo -u wwwrun svn up /srv/www/htdocs/$playschool

17
এটি কোনও স্ক্রিপ্টে ব্যবহার করার সময়, শর্টহ্যান্ড অপ্রয়োজনীয় এবং বিভ্রান্তিকর হতে পারে। sourceএটি পরিষ্কার করতে পুরো কমান্ডটি ব্যবহার করবেন না কেন ?
লাইল

2
@ লাইল কারণ আপনি যখন চান না তখন আপনার স্ক্রিপ্টটি পোর্টেবল পসিক্স সিনট্যাক্স থেকে কৃতজ্ঞভাবে বিচ্যুত না হয়?
ট্রিপলি

14

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

12

বিশেষত সুরক্ষার ক্ষেত্রে আমার একই সমস্যা রয়েছে এবং আমি সমাধানটি এখানে পেয়েছি ।

আমার সমস্যাটি হ'ল, আমি একটি কনফিগার ফাইলের সাথে ব্যাশ-এ একটি স্থাপনার স্ক্রিপ্ট লিখতে চেয়েছিলাম যা এই জাতীয় কিছু পথ রয়েছে content

################### 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" কমান্ড নিয়ে গঠিত এবং এই ভেরিয়েবলের সাথে কনফিগার ফাইলটি আমদানি করে। 'উত্সের পথ / টু / ফাইল' তবে এই সমাধানটিতে কিছু সুরক্ষা সমস্যা রয়েছে কারণ উত্সযুক্ত ফাইলটিতে বাশ স্ক্রিপ্টের যে কোনও কিছুই থাকতে পারে। এটি সুরক্ষার সমস্যা তৈরি করে। আপনার স্ক্রিপ্টটির কনফিগারেশন ফাইলটি স্যুর করার সময় কোনও ম্যালিসিকোস ব্যক্তি সালিসী কোডটি "চালানো" করতে পারে।

এরকম কিছু কল্পনা করুন:

 ################### 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

1
আমি আপনার সিনট্যাক্স পরীক্ষককে যাচাই করে নিইনি যে এটির সমস্ত ক্ষেত্রে সঠিকভাবে অ্যাকাউন্ট রয়েছে তা নিশ্চিত করার জন্য, তবে এটি সুরক্ষা সমস্যার কারণে এখন পর্যন্ত সেরা ধারণা।
অ্যাঞ্জেলো

6
এটি যথেষ্ট সুরক্ষিত নয়, আপনি এখনও করতে পারেন CMD="$(rm -fr ~/*)"
svlasov

ধন্যবাদ @ সোভালোসভ, আমি মনে করি এটি একটি গুরুতর সমস্যা, আমি এই জাতীয় সমস্যাটি এড়াতে আমার উত্তরটি সম্পাদনা করি যাতে কমান্ড বিয়োগদানের জন্য ব্যবহৃত অক্ষরগুলি (এবং চূড়ান্ত হিসাবে প্রত্যাখ্যান করেCONFIG_SYNTAX="(^\s*#|^\s*$|^\s*[a-z_][^[:space:]]*=[^;&\(`]*$)"
এরমান

এখনও যথেষ্ট নয়। foo=bar unleash_virusকার্যকর করা যেতে পারে। দ্রষ্টব্য foo=bar\ unleash_virus, foo="bar unleash_virus"এবং foo=bar #unleash_virusনিরাপদ। সঠিকভাবে স্যানিটাইজ করা সহজ নয় এবং যাইহোক কিছু ক্ষতিকারক সিনট্যাক্স ব্লক না করা, বিশেষত যখন আপনি প্রতিটি সম্ভাব্য উদ্ধৃতি এবং পালানোর কথা ভাবেন।
কামিল ম্যাকিয়েরোভস্কি

9

বাশ-এ, কোনও ফাইলের পরিবর্তে কিছু কমান্ডের আউটপুট উত্স করতে:

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

উল্লেখ


3

প্যারামিটার ফাইলকে পরিবেশের ভেরিয়েবলগুলিতে রূপান্তর করা

আমার ফাইলে নির্দিষ্ট কিছু শিল্পকর্মের জটিলতা এড়াতে সাধারণত আমি সোরিংয়ের পরিবর্তে পার্সিংয়ের দিকে যাই। এটি আমাকে বিশেষভাবে উদ্ধৃতি এবং অন্যান্য জিনিসগুলি হ্যান্ডেল করার উপায়ও সরবরাহ করে। আমার মূল লক্ষ্য হ'ল '=' এর পরে যা কিছু আসে তা আক্ষরিক হিসাবে রাখা, এমনকি দ্বিগুণ উদ্ধৃতি এবং ফাঁকা স্থান।

#!/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}"

সবচেয়ে দক্ষ নয়, তবে ছোট ফাইলগুলি খুব পরিষ্কারভাবে কাজ করে ly


2

যদি ভেরিয়েবলগুলি উত্পন্ন হচ্ছে এবং কোনও ফাইলে সংরক্ষণ না করা হয় তবে আপনি সেগুলিতে পাইপ করতে পারবেন না source। প্রতারণামূলকভাবে এটি করার সহজ উপায় হ'ল:

some command | xargs

-1

ভেরিয়েবলযুক্ত স্ক্রিপ্টটি ব্যাশ ব্যবহার করে আমদানি করা যায়। লিপিটি বিবেচনা করুন- পরিবর্তনযোগ্য

#!/bin/sh
scr-var=value

আসল স্ক্রিপ্টটি বিবেচনা করুন যেখানে ভেরিয়েবলটি ব্যবহৃত হবে:

 #!/bin/sh
 bash path/to/script-variable.sh
 echo "$scr-var"

এটি কাজ করে না, এটি সাব-প্রসেসে বাশ স্ক্রিপ্টটি চালাবে এবং তার জীবদ্দশায় এটি তৈরি করা কোনও পরিবেশ (ভেরিয়েবল সহ) হারাবে। এছাড়াও src-varকোনও বৈধ শনাক্তকারী নয়।
ট্রিপলি

-1

নামকরণ বিরোধগুলি প্রতিরোধের জন্য, কেবলমাত্র আপনার প্রয়োজনীয় ভেরিয়েবলগুলি আমদানি করুন:

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

    echo $(
        source "${file}";
        eval echo \$\{${variable}\}
    )
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.