ব্যাশ স্ক্রিপ্টে ট্যাব ডিলিনেটেড ফাইলের মাধ্যমে লুপ করুন


18

আমার এখন পর্যন্ত যা আছে তা এখানে:

#!/bin/bash
while read line; do
        DB=$(echo $line | cut -f1)
        USER=$(echo $line | cut -f2)
        PASS=$(echo $line | cut -f3)
        echo DB=$DB USER=$USER PASS=$PASS
done < users.txt

এবং ইনপুট ফাইলের একটি নমুনা:

drupal_1    drupal1 tmmjXSWL
drupal_2    drupal2 FHiJSYHM
drupal_3    drupal3 b7bFNj06
drupal_4    drupal4 0AaV62EL

এবং স্ক্রিপ্ট থেকে আউটপুট:

DB=drupal_1 drupal1 tmmjXSWL USER=drupal_1 drupal1 tmmjXSWL PASS=drupal_1 drupal1 tmmjXSWL
DB=drupal_2 drupal2 FHiJSYHM USER=drupal_2 drupal2 FHiJSYHM PASS=drupal_2 drupal2 FHiJSYHM
DB=drupal_3 drupal3 b7bFNj06 USER=drupal_3 drupal3 b7bFNj06 PASS=drupal_3 drupal3 b7bFNj06

কিছু কারণে প্রতিটি ভেরিয়েবল পুরো লাইনে সেট করা থাকে। আমি যখন echo users.txt | cut -f1কমান্ড লাইনে ব্যবহার করি , এটি টোকনটি ঠিকঠাক করে দেয়।

উত্তর:


6

এ কেমন?

$ awk '{print "DB="$1"\tUSER="$2"\tPASS="$3}' users.txt
DB=drupal_1 USER=drupal1    PASS=tmmjXSWL
DB=drupal_2 USER=drupal2    PASS=FHiJSYHM
DB=drupal_3 USER=drupal3    PASS=b7bFNj06
DB=drupal_4 USER=drupal4    PASS=0AaV62EL

আপনার সমস্যা সমাধানের সমস্যা আছে কিনা, বা আরও তাত্ত্বিক সমস্যা নিয়ে ভাবছেন কিনা তা আমি বলতে পারি না।


ধন্যবাদ, কাজ করে। আমি যে ক্লাসটি শেখাচ্ছি তার জন্য একটি সার্ভারে 40+ ড্রুপাল ইনস্টলেশন তৈরির জন্য আমি একটি স্ক্রিপ্ট লেখার চেষ্টা করছি। আমার কাছে ডিবি এবং ফাইলগুলি সেটআপ করার জন্য স্ক্রিপ্ট রয়েছে, এটি স্ক্রিপ্টের একটি অংশ যা এগুলি একসাথে রেখে দেবে। আমার কোডটির সাথে সমস্যাটি হ'ল tab লাইনটি পার্স করার সাথে সাথে ট্যাবগুলিকে স্পেসে পরিণত করেছে। $(echo $line | cut -d" " -f1)কাজ করে।
মর্টোনা 42

ক্ষেত্রের কোনও ক্ষেত্রে শূন্যস্থান থাকলে আমার জন্য ব্যর্থ হয়
v01pe

21

সমস্যাটি কমান্ডের মধ্যে রয়েছে echo $line। আশেপাশে কোনও উদ্ধৃতি নেই বলে $lineশেলটি এতে শব্দ বিভাজন সম্পাদন করে, তারপরে প্রতিটি শব্দকে গ্লোব্বিং প্যাটার্ন হিসাবে ব্যাখ্যা করে। এটি দিয়ে চেষ্টা করুন

a='*.txt foo'
ls $a

আপনার ক্ষেত্রে, ট্যাবগুলি পৃথক পৃথক শব্দের সাথে পৃথক যুক্তি হয়ে যায় echoechoকমান্ড ছাপে এর আর্গুমেন্টগুলি একটি স্থান দ্বারা পৃথক। সুতরাং cutট্যাব-বিসীমাবদ্ধ ক্ষেত্রগুলির পরিবর্তে স্থান-সীমাবদ্ধ ক্ষেত্রগুলি গ্রহণ করা শেষ হয়।

পরিবর্তনশীল বিকল্প $fooএবং কমান্ড বিকল্পের চারপাশে সর্বদা ডাবল উদ্ধৃতি রাখুন$(foo) (যদি না বুঝতে থাকেন যে কেন আপনাকে এগুলি ছেড়ে চলে যেতে হবে এবং কেন এটি ঠিক আছে)। echo "$line"এখানে কাজ করবে, তবে আপনি যা প্রস্তাব করবেন তা করার এটি একটি জটিল উপায়।

শেলের মধ্যে পার্সিংয়ের আপনার পদ্ধতির উপর নির্ভর করে আপনি readকমান্ডটি ক্ষেত্রগুলিতে ইনপুট পার্স করতে পারেন ।

while read DB USER PASS; do
  echo "DB=$DB USER=$USER PASS=$PASS"
done <users.txt

readIFSডিফল্টরূপে ভেরিয়েবলের মানতে ক্ষেত্রগুলি অক্ষর দ্বারা পৃথক করা হয় , যা একটি স্থান এবং একটি ট্যাব (প্লাস একটি নতুন লাইন, যা একটি লাইনের অভ্যন্তরে ঘটতে পারে না) নিয়ে থাকে default কেবল ট্যাবগুলিতে বিভক্ত করতে IFSপ্রথমে একটি একক ট্যাবে সেট করুন । নোট করুন যে শীর্ষস্থানীয় এবং অনুসরণযোগ্য ট্যাবগুলিকে উপেক্ষা করা হয় এবং পর পরের ট্যাবগুলিকে একক হিসাবে গণনা করা হয়।

read\একটি বিশেষ চরিত্র হিসাবে আচরণ করে : একটি নিউলাইন অনুসরণ করা ব্যাকস্ল্যাশ উপেক্ষা করা হয়; \\একক ব্যাকস্ল্যাশ হয়ে যায়। আপনি যদি এই আচরণটি এড়াতে চান তবে -rবিকল্পটি পাস করুন ।


15
+1 টি। IFS=$'\t'
বাশে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.