सवाल मैं एक फ़ाइल से एक चर कैसे पढ़ूं?


मैं अपनी स्क्रिप्ट में एक मान (स्ट्रिंग) डालना चाहता हूं जिसे मैं एक टेक्स्ट फ़ाइल से पढ़ूंगा।

उदाहरण के लिए, इसके बजाए:

echo "Enter your name"
read name

मैं एक और पाठ फ़ाइल से एक स्ट्रिंग को पढ़ना चाहता हूं ताकि दुभाषिया को फ़ाइल से स्ट्रिंग को पढ़ना चाहिए, न कि उपयोगकर्ता इनपुट।


46
2017-10-28 08:35


मूल


आपकी टेक्स्ट फ़ाइल कैसी दिखती है? क्या संपूर्ण फ़ाइल 1 चर या वे हैं KEY=VALUE जोड़े? समाधान काफी अलग हैं (यदि यह बाद वाला है, तो Takkat का जवाब लागू होता है, पूर्व राडू के) - kiri
@CiroSantilli इसे किसी अन्य उपयोगकर्ता द्वारा पोस्ट किया गया था, तो क्रॉसपोस्ट नहीं किया गया है, "क्रॉस-साइट डुप्लिकेट" जैसी कोई चीज़ नहीं है। एकमात्र चीज जिसे टाला जाना चाहिए वह है वही सवाल पूछा गया वही विभिन्न साइटों पर उपयोगकर्ता। - terdon♦


जवाब:


फ़ाइल से चर पढ़ने के लिए हम इसका उपयोग कर सकते हैं source आदेश या . ऑपरेटर

आइए मान लें कि फ़ाइल में निम्न पंक्ति है

MYVARIABLE="Any string"

फिर हम इस चर का उपयोग कर आयात कर सकते हैं

#!/bin/bash

source <filename>
echo $MYVARIABLE

73
2017-10-28 09:44



एक कारण यह है कि आप ऐसा क्यों नहीं करना चाहते हैं क्योंकि जो कुछ भी है <filename> आपके खोल में चलाया जाएगा, जैसे कि rm -rf /, जो बहुत खतरनाक हो सकता है। - Mark Ribau
पार्टी के लिए देर हो चुकी है, लेकिन, नहीं, यह चिह्नित करने के लिए या उत्तर के रूप में लायक नहीं है। यह एक और बैश स्रोत फ़ाइल स्रोत करता है जो ओपी ने नहीं पूछा था। उन्होंने एक चर के रूप में एक फ़ाइल की सामग्री को पढ़ने के लिए कहा। एक और स्क्रिप्ट निष्पादित करने के लिए कैसे नहीं एक चर सेट करता है। सही उत्तर नीचे दिया गया है। नाम = $ (बिल्ली "$ फ़ाइल")। - Richard Riley
ओटीओएच, यह सवाल है कि मैंने Google से पूछा और Google ने मुझे यहां लाया। अजीब बार, आह? - Michael Terry
ग्रेट कई चर के लिए भी काम करता है! @MarkRibau का बिंदु समझा जाता है, लेकिन मुझे लगता है कि यदि आप फ़ाइल को एक अलग लिपि में सही करते हैं और इसे ठीक से नियंत्रित और नियंत्रित करना है। - madlymad
आप उपयोग कर सकते हैं sed जोड़ने के लिए local कीवर्ड और स्क्रिप्ट को थोड़ा सुरक्षित बनाएं और अपने वैश्विक दायरे को विनियमित न करें। तो एक समारोह के अंदर करते हैं cat global_variables.sh | sed -e 's/^/local /' > local_variables.sh और फिर उपयोग करें . ./local_variables.sh। जो भी आप फ़ंक्शन में आयात करते हैं वह केवल उस फ़ंक्शन में उपलब्ध होगा। ध्यान दें कि यह मानता है global_variables.sh केवल प्रति पंक्ति एक चर है। - Nux


यह ध्यान में रखते हुए कि आप अपनी टेक्स्ट फ़ाइल की सभी सामग्री को अपने चर में रखना चाहते हैं, आप इसका उपयोग कर सकते हैं:

#!/bin/bash

file="/path/to/filename" #the file where you keep your string name

name=$(cat "$file")        #the output of 'cat $file' is assigned to the $name variable

echo $name               #test

या, शुद्ध बैश में:

#!/bin/bash

file="/path/to/filename"     #the file where you keep your string name

read -d $'\x04' name < "$file" #the content of $file is redirected to stdin from where it is read out into the $name variable

echo $name                   #test

42
2017-10-28 08:44



मैं चर प्रदर्शित नहीं करना चाहता, मैं चाहता हूं कि इस चर को आगे की प्रक्रिया के लिए स्क्रिप्ट द्वारा पढ़ा जाना चाहिए। मैंने अजीब कोशिश की है जो रेखा से लाइन पढ़ता है। - user208413
ठीक है, हटाओ echo $name । मैं सिर्फ परीक्षण के लिए इसका इस्तेमाल करता हूं। अगला आप उपयोग कर सकते हैं $name अपनी स्क्रिप्ट में कहीं भी आगे की प्रक्रिया के लिए परिवर्तनीय। - Radu Rădeanu
मैं इसे कहीं भी अपनी स्क्रिप्ट का उपयोग नहीं कर सकता क्योंकि डी स्क्रिप्ट चर के मान को नहीं जानता है। हमारे मामले में परिवर्तनीय नाम। - user208413
@ user208413 का मूल्य $name वैरिएबल है जो आपकी फ़ाइल से उपयोग की गई स्ट्रिंग है cat $file आदेश। समझने के लिए स्पष्ट या इतना मुश्किल क्या नहीं है? - Radu Rădeanu
एक अलग का उपयोग करने के लिए यह अनावश्यक है $file परिवर्तनीय अगर आप इसे लोड करने के लिए केवल एक बार उपयोग कर रहे हैं $name परिवर्तनीय, बस उपयोग करें cat /path/to/file - kiri


अपनी लिपि के भीतर से आप यह कर सकते हैं:

read name < file_containing _the_answer

आप यह कई बार भी कर सकते हैं उदा। एक पाश में

while read LINE; do echo "$LINE"; done < file_containing_multiple_lines

9
2017-10-28 22:35



या प्रत्येक पंक्ति पर एकाधिक वस्तुओं वाली फ़ाइल के लिए। । । grep -v ^ # फ़ाइल | एक बी सी पढ़ते समय; एक = $ एक बी = $ बी सी = $ सी गूंज करो; किया हुआ - gaoithe


ऐसा करने का एक वैकल्पिक तरीका सिर्फ आपकी फ़ाइल में मानक इनपुट को रीडायरेक्ट करना होगा, जहां आपके पास प्रोग्राम द्वारा अपेक्षित क्रम में सभी उपयोगकर्ता इनपुट होंगे। उदाहरण के लिए, कार्यक्रम के साथ (कहा जाता है script.sh)

#!/bin/bash
echo "Enter your name:"
read name
echo "...and now your age:"
read age

# example of how to use the values now stored in variables $name and $age
echo "Hello $name. You're $age years old, right?"

और इनपुट फ़ाइल (कहा जाता है input.in)

Tomas
26

आप इसे निम्नलिखित दो तरीकों से टर्मिनल से चला सकते हैं:

$ cat input.in | ./script.sh
$ ./script.sh < input.in

और यह केवल स्क्रिप्ट चलाने और डेटा को मैन्युअल रूप से दर्ज करने के बराबर होगा - यह "हैलो टॉमस" पंक्ति प्रिंट करेगा। आप 26 वर्ष के हैं, है ना? "।

जैसा राडू रादेनु है पहले से ही सुझाव दिया है, आप उपयोग कर सकते हैं cat किसी फ़ाइल की सामग्री को एक सारणी में पढ़ने के लिए अपनी स्क्रिप्ट के अंदर - उस स्थिति में, आपको केवल एक पंक्ति रखने के लिए प्रत्येक फ़ाइल की आवश्यकता होती है, केवल उस मान के साथ जो आप उस विशिष्ट चर के लिए चाहते हैं। उपर्युक्त उदाहरण में, आप इनपुट फ़ाइल को नाम से एक में विभाजित करेंगे (कहें, name.in) और उम्र के साथ एक (कहो, age.in), और बदलें read name तथा read age लाइनों के लिए name=$(cat name.in)  तथा age=$(cat age.in) क्रमशः।


6
2017-10-28 09:57



मेरे पास निम्न स्क्रिप्ट है: vh = awk "एनआर == 3 {प्रिंट; बाहर निकलें}" /var/www/test/test.txt इसके साथ मैं test.txt नामक टेक्स्ट फ़ाइल से लाइन 3 पढ़ता हूं। एक बार जब मैं एक स्ट्रिंग प्राप्त करता हूं तो मैं निर्देशिका बनाने के लिए इनपुट के रूप में इस स्ट्रिंग का उपयोग करना चाहता हूं - user208413
इसे बदलें vh=$(awk "NR==3 {print;exit}" /var/www/test.txt)। फिर आपके पास चर में चर स्ट्रिंग होगी $vh, तो आप इसे इस तरह उपयोग कर सकते हैं: mkdir "/var/www/$vh" - यह निर्दिष्ट नाम के साथ / var / www के अंदर एक फ़ोल्डर बना देगा। - Tomas Lycken
मैंने इस तरह से किया है लेकिन यह अभी भी फ़ोल्डर नहीं बना सकता है :( - user208413
@ user208413: आपको क्या त्रुटि संदेश मिलता है? दुर्भाग्यवश, "यह काम नहीं करता है", एक बहुत उपयोगी समस्या विवरण नहीं है ... - Tomas Lycken


संक्षिप्त जवाब:

name=`cat "$file"`

2
2017-09-17 14:53





मुझे यहां समाधान समाधान मिला: https://af-design.com/2009/07/07/loading-data-into-bash-variables/

if [ -f $SETTINGS_FILE ];then
    . $SETTINGS_FILE
fi

2
2018-01-24 15:33



स्लाइड्स अब उपलब्ध नहीं हैं। - kris


यदि आप एकाधिक तारों का उपयोग करना चाहते हैं, तो आप इसके साथ जा सकते हैं:

path="/foo/bar";
for p in `cat "$path"`;
do echo "$p" ....... (here you would pipe it where you need it) 

या

यदि आप चाहते हैं कि उपयोगकर्ता फ़ाइल को इंगित करे

read -e "Specify path to variable(s): " path;
for p in 'cat "$path"';
do echo "$p" ............................

0
2018-06-10 16:47