मैं फ़ाइल से चर कैसे पढ़ सकता हूँ?


68

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

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

echo "Enter your name"
read name

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


1
आपकी टेक्स्ट फ़ाइल कैसी दिखती है? क्या संपूर्ण फ़ाइल 1 चर है या वे KEY=VALUEजोड़े हैं? समाधान काफी अलग हैं (यह यदि मान बाद Takkat का जवाब लागू होता है, पूर्व राडू के)
किरी

1
@CiroSantilli यह क्रॉसपोस्ट नहीं है यदि इसे किसी भिन्न उपयोगकर्ता द्वारा पोस्ट किया गया था, तो "क्रॉस-साइट डुप्लिकेट" जैसी कोई चीज नहीं है। केवल एक चीज जिसे टाला जाना चाहिए, वही सवाल विभिन्न साइटों पर एक ही उपयोगकर्ता द्वारा पूछा जाता है।
terdon

जवाबों:


98

किसी फ़ाइल से चर पढ़ने के लिए हम sourceया .कमांड का उपयोग कर सकते हैं ।

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

MYVARIABLE="Any string"

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

#!/bin/bash

source <filename>
echo $MYVARIABLE

16
एक कारण यह है कि आप इसे इस तरह से नहीं करना चाहते हैं क्योंकि जो कुछ भी <filename>आपके शेल में चलाया जाएगा, जैसे कि rm -rf /, जो बहुत खतरनाक हो सकता है।
मार्क रिबाऊ

3
पार्टी के लिए देर से, लेकिन, नहीं, यह जवाब के रूप में चिह्नित या होने के लायक नहीं है। यह स्रोत एक और bash स्रोत फ़ाइल है जो ओपी के लिए नहीं कहा गया है। उन्होंने पूछा कि कैसे एक चर में एक फ़ाइल की सामग्री को पढ़ने के लिए। किसी अन्य स्क्रिप्ट को निष्पादित करने का तरीका नहीं है जो एक चर सेट करता है । सही उत्तर नीचे दिया गया है। नाम = $ (बिल्ली "$ फ़ाइल")।
12

2
OTOH, यह उस प्रश्न का उत्तर है जो मैंने Google से पूछा था और Google मुझे यहां लाया था। अजीब समय, एह?
टेरी में माइकल टेरी

1
महान भी कई चर के लिए काम करता है! @MarkRibau की बात समझ में आती है, लेकिन मुझे लगता है कि यदि आप किसी अलग स्क्रिप्ट में फ़ाइल को सही करते हैं और बस इसे ठीक और नियंत्रित पर पास करना है।
मैडलमाड

1
आप कीवर्ड sedजोड़ने localऔर स्क्रिप्ट को थोड़ा सुरक्षित बनाने के लिए उपयोग कर सकते हैं न कि अपने वैश्विक दायरे को बढ़ा सकते हैं । तो अंदर फंक्शन करते हैं cat global_variables.sh | sed -e 's/^/local /' > local_variables.shऔर फिर उपयोग करते हैं . ./local_variables.sh। आप फ़ंक्शन में जो भी आयात करते हैं, वह केवल उस फ़ंक्शन में उपलब्ध होगा। ध्यान दें कि यह मानता है कि global_variables.shप्रति पंक्ति केवल एक चर होता है।
नक्स

55

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

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

मैं चर प्रदर्शित नहीं करना चाहता, मैं चाहता हूं कि इस चर को आगे की प्रक्रिया के लिए स्क्रिप्ट द्वारा पढ़ा जाना चाहिए। मैं awk की कोशिश की है जो लाइन द्वारा लाइन पढ़ता है।
user208413

1
ठीक है, हटाओ echo $name । मैं इसे सिर्फ टेस्ट के लिए इस्तेमाल करता हूं। आगे आप $nameअपनी स्क्रिप्ट में कहीं भी प्रसंस्करण के लिए चर का उपयोग कर सकते हैं ।
राडू रियडेनू

मैं इसे कहीं भी इसका उपयोग नहीं कर सकता क्योंकि यह स्क्रिप्ट है क्योंकि dhe स्क्रिप्ट को वैरिएबल का मूल्य नहीं पता है। हमारे मामले में चर नाम।
user208413

6
@ user208413 $nameचर का मान cat $fileकमांड का उपयोग करके आपकी फ़ाइल द्वारा निर्दिष्ट स्ट्रिंग है । क्या स्पष्ट या इतना मुश्किल नहीं है समझने के लिए?
रादु राईडेनु

1
यह एक अलग $fileचर का उपयोग करने के लिए बेमानी है यदि आप केवल एक बार $nameचर को लोड करने के लिए इसका उपयोग कर रहे हैं , तो बस उपयोग करेंcat /path/to/file
kiri

11

अपनी स्क्रिप्ट के भीतर से आप ऐसा कर सकते हैं:

read name < file_containing _the_answer

तुम भी एक पाश में कई बार कर सकते हैं

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

या प्रत्येक पंक्ति में एक से अधिक आइटम वाली फ़ाइल के लिए। । । grep -v ^ # फ़ाइल | एबीसी पढ़ते समय; echo a = $ ab = $ bc = $ c; किया
गॉथे

7

ऐसा करने का एक वैकल्पिक तरीका यह होगा कि आप अपनी फ़ाइल में सिर्फ मानक इनपुट को पुनर्निर्देशित करें, जहाँ आपके पास प्रोग्राम द्वारा अपेक्षित उपयोगकर्ता इनपुट है। उदाहरण के लिए, कार्यक्रम के साथ (बुलाया 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)क्रमशः और बदल दें ।


मेरे पास निम्न लिपि है: vh = awk "NR == 3 {प्रिंट; एक्जिट}" /var/www/test/test.txt इसके साथ मैं लाइन 3 पढ़ता हूं जिसका नाम test.txt नामक टेक्स्ट फाइल है। एक बार जब मुझे एक स्ट्रिंग मिलती है तो मैं इस स्ट्रिंग को एक निर्देशिका बनाने के लिए एक इनपुट के रूप में उपयोग करना चाहता हूं
user208413

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

मैंने इस तरह से किया है, लेकिन यह अभी भी फ़ोल्डर नहीं बना सकता है :(
user208413

@ user208413: आपको क्या त्रुटि संदेश मिला है? "यह काम नहीं करता है", दुर्भाग्य से, एक बहुत ही उपयोगी समस्या का वर्णन नहीं है ...
टॉमस असचन


3
name=$(<"$file") 

से man bash:1785, यह कमांड प्रतिस्थापन name=$(cat "$file")अधिक तेज़ लेकिन बराबर है ।



0

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

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

मैं एक फ़ाइल से एक एकल चर प्राप्त करने के लिए इसका उपयोग करता हूं

GET_VAR=$(grep --color=never -Po "^${GET_VAR}=\K.*" "${FILE}" || true)

जब GET_VARयह नहीं पाया जाता है ${FILE}तो त्रुटि के कारण रिक्त होगा बजाय धन्यवाद के || true

इसका उपयोग वह है grep -Pजो GNU grep में है, लेकिन इसे लिखने के समय सभी grep में डिफ़ॉल्ट नहीं है।


यह मेरे लिए काम नहीं लगता है। प्रारंभिक $ अवैध चरित्र के लिए एक त्रुटि फेंकता है
गिनना
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.