আমি কীভাবে কোনও ফাইল থেকে পরিবর্তনশীল পড়তে পারি?


68

আমি আমার স্ক্রিপ্টে একটি মান (স্ট্রিং) thatোকাতে চাই যা আমি একটি পাঠ্য ফাইল থেকে পড়তে পারি।

উদাহরণস্বরূপ, পরিবর্তে:

echo "Enter your name"
read name

আমি অন্য পাঠ্য ফাইল থেকে একটি স্ট্রিং পড়তে চাই যাতে দোভাষীকে ফাইল থেকে স্ট্রিংটি পড়তে হবে এবং ব্যবহারকারী ইনপুটটি নয়।


1
আপনার পাঠ্য ফাইলটি কেমন দেখাচ্ছে? পুরো ফাইলটি 1 পরিবর্তনশীল বা তারা KEY=VALUEজোড়া? সমাধানগুলি একেবারেই আলাদা (যদি এটি পরে হয়, তক্কাতের উত্তর প্রযোজ্য হয়, প্রাক্তন রাদুর)
কিরি

1
@ সিরোসন্টিলি এটি কোনও অন্য ব্যবহারকারী দ্বারা পোস্ট করা হলে এটি ক্রসপোস্ট করা হয় না, "ক্রস-সাইট নকল" বলে কোনও জিনিস নেই। একমাত্র যে জিনিসটি এড়ানো উচিত তা হ'ল একই সাইট একই ব্যবহারকারী দ্বারা বিভিন্ন সাইটে জিজ্ঞাসা করা ।
টেরডন

উত্তর:


98

একটি ফাইল থেকে ভেরিয়েবলগুলি পড়তে আমরা sourceor .কমান্ড ব্যবহার করতে পারি ।

ধরে নেওয়া যাক ফাইলটিতে নিম্নলিখিত লাইনটি রয়েছে

MYVARIABLE="Any string"

তারপরে আমরা এই ভেরিয়েবলটি ব্যবহার করে আমদানি করতে পারি

#!/bin/bash

source <filename>
echo $MYVARIABLE

16
আপনি যেভাবে এটি না করতে চান তার একটি কারণ হ'ল যা যা আছে <filename>তা আপনার শেলের মধ্যে চালানো হবে, যেমন rm -rf /, যা খুব বিপজ্জনক হতে পারে।
মার্ক রিবাউ 10'15

3
পার্টিতে দেরীতে, তবে, না, এটি চিহ্নিত হওয়ার বা উত্তর হিসাবে পাওয়ার যোগ্য নয়। এটি অপরটি বাশ উত্স ফাইলটি উত্স করে যা ওপি যা চেয়েছিল তা নয়। তিনি জিজ্ঞাসা করলেন কীভাবে কোনও ফাইলের বিষয়বস্তুগুলিকে ভেরিয়েবলে পড়তে হয়। কীভাবে অন্য স্ক্রিপ্টটি কার্যকর করতে হয় যা ভেরিয়েবল সেট করে । সঠিক উত্তরটি নীচের একটি। নাম = $ (বিড়াল "$ ফাইল")।
HörmannHH

2
ওও, গুগল এবং গুগল আমাকে এখানে এনেছে এমন প্রশ্নের উত্তর এটি is অদ্ভুত সময়, আহ?
মাইকেল টেরি

1
গ্রেট একাধিক ভেরিয়েবলের জন্যও কাজ করে! @ মার্করিবাউ এর পয়েন্টটি বোঝা যাচ্ছে তবে আমি অনুমান করি যে আপনি যদি ফাইলটিকে অন্য স্ক্রিপ্টে ডানদিক করেন এবং কেবল এটি সূক্ষ্ম এবং নিয়ন্ত্রিত হয়ে পাস করতে হয়।
পাগলামি

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

আমি ভেরিয়েবলটি প্রদর্শন করতে চাই না, আমি চাই যে এই পরিবর্তনশীলটি আরও প্রক্রিয়াকরণের জন্য স্ক্রিপ্ট দ্বারা পড়া উচিত। আমি অদ্ভুত চেষ্টা করেছি যা একের পর এক লাইনে পড়ে।
ব্যবহারকারী 208413

1
ঠিক আছে, মুছুন echo $name । আমি এটি কেবল পরীক্ষার জন্য ব্যবহার করি। এরপরে আপনি $nameআপনার স্ক্রিপ্টে যে কোনও জায়গাতেই আরও প্রক্রিয়াজাতকরণের জন্য ভেরিয়েবল ব্যবহার করতে পারেন ।
রাদু রেডানু

আমি এটি আমার স্ক্রিপ্টের যেকোন জায়গায় এটি ব্যবহার করতে পারি না কারণ স্ক্রিপ্ট ভেরিয়েবলের মান জানে না। আমাদের ক্ষেত্রে চলক নাম।
ব্যবহারকারী 208413

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 ^ # ফাইল | এবিসি পড়ার সময়; do প্রতিধ্বনি a = $ ab = $ বিসি = $ সি; সম্পন্ন হয়েছে
গায়েথেকে

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

এবং এটি কেবল স্ক্রিপ্টটি চালানো এবং ম্যানুয়ালি ডেটা প্রবেশের সমান হবে - এটি "হ্যালো টমাস। লাইনটি প্রিন্ট করবে You're আপনি 26 বছর বয়সী, তাই না?"

হিসাবে Radu Rădeanu করেছে ইতিমধ্যেই এটিকে , আপনি ব্যবহার করতে পারে catআপনার স্ক্রিপ্টের ভিতরে avariable মধ্যে একটি ফাইলের বিষয়বস্তু পড়তে - যে ক্ষেত্রে, আপনি প্রতিটি ফাইল প্রয়োজন আপনি যে নির্দিষ্ট পরিবর্তনশীল চান শুধুমাত্র মান শুধুমাত্র এক লাইন ধারণ করে। উপরের উদাহরণে, আপনি ইনপুট ফাইলটিকে নামের সাথে (একটি বলুন name.in) এবং একটিতে বয়সের সাথে (বলুন age.in) বিভক্ত করতে পারেন এবং যথাক্রমে read nameএবং read ageলাইনগুলি পরিবর্তন করতে পারেন ।name=$(cat name.in)age=$(cat age.in)


আমার কাছে নিম্নলিখিত স্ক্রিপ্ট রয়েছে: vh = awk "এনআর == 3 {প্রিন্ট; প্রস্থান; প্রস্থান" / "/var/www/test/test.txt এর সাথে আমি টেস্ট.টেক্সট নামের টেক্সট ফাইল থেকে লাইন 3 পড়ি। আমি একবার স্ট্রিং পেয়ে গেলে এই স্ট্রিংটি ডিরেক্টরি তৈরির জন্য একটি ইনপুট হিসাবে ব্যবহার করতে চাই
ব্যবহারকারী 208413

1
এতে পরিবর্তন করুন vh=$(awk "NR==3 {print;exit}" /var/www/test.txt)। তারপরে আপনার স্ট্রিংটি ভেরিয়েবলে সংরক্ষণ করা হবে $vh, সুতরাং আপনি এটি এর মতো ব্যবহার করতে পারেন: mkdir "/var/www/$vh"- এটি / var / www এর মধ্যে নির্দিষ্ট নামের সাথে একটি ফোল্ডার তৈরি করবে।
টমাস আসচান

আমি এইভাবে করেছি তবে এটি এখনও ফোল্ডারটি তৈরি করতে পারে না :(
ব্যবহারকারী 208413

@ ব্যবহারকারী 208413: আপনি কী ত্রুটি বার্তা পেয়েছেন? "এটি কাজ করে না" দুর্ভাগ্যক্রমে খুব সহায়ক সমস্যার বর্ণনা নয় ...
টমাস আসচান


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জিএনইউ গ্রেপতে ব্যবহার করে তবে এটি লেখার সময় সমস্ত গ্রেপের মধ্যে ডিফল্ট নয়।


এটি আমার পক্ষে কাজ করে না বলে মনে হচ্ছে। প্রাথমিক $ জন্য অবৈধ অক্ষর একটি ত্রুটি ছোঁড়া
ginna
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.