আমি কি শেল স্ক্রিপ্ট আর্গুমেন্ট হিসাবে পাইপ আউটপুট ব্যবহার করতে পারি?


22

ধরুন আমার কাছে ব্যাশ শেল স্ক্রিপ্ট রয়েছে যার Myscript.shইনপুট হিসাবে একটি যুক্তি প্রয়োজন।

তবে আমি চাই যে পাঠ্য ফাইলটির বিষয়বস্তুটিকে text.txtসেই আর্গুমেন্ট হিসাবে ডাকা হবে।

আমি এটি চেষ্টা করেছি কিন্তু এটি কার্যকর হয় না:

cat text.txt | ./Myscript.sh

এই কাজ করতে একটি উপায় আছে কি?

উত্তর:



19

আপনি শেল স্ক্রিপ্ট আর্গুমেন্ট হিসাবে পাইপ আউটপুট ব্যবহার করতে পারেন।

এই পদ্ধতিটি ব্যবহার করে দেখুন:

cat text.txt | xargs -I {} ./Myscript.sh {}

2

আপনার যদি ফাইলে একাধিক কমান্ড থাকে তবে xargs বা সমান্তরাল ব্যবহার বিবেচনা করুন , যেমন using

xargs -d '\n' Myscript.sh < text.txt
parallel -j4 Myscript.sh < text.txt

0

চেষ্টা করুন,

 $ cat comli.txt
 date
 who
 screen
 wget

 $ cat comli.sh
 #!/bin/bash
 which $1

 $ for i in `cat comli.txt` ; do ./comli.sh $i ; done

তাই আপনি মান একের পর এক লিখতে পারেন comli.shথেকে comli.txt



0

ম্যাপফাইলে স্টিডিন পড়ে আপনি অবস্থানগত পরামিতিগুলি পুনরায় সেট করতে পারেন।

#!/bin/bash

[[ -p /dev/stdin ]] && { mapfile -t; set -- "${MAPFILE[@]}"; }

for i in $@; do
    echo "$((++n)) $i"
done

("$ @" এর উদ্ধৃতি দিয়ে forপরিবর্তে লুপ লাইন তৈরি করবে)।

$ cat test.txt | ./script.sh
1 one
2 two
3 tree

0

আইএমএইচও কেবলমাত্র সঠিকভাবে প্রশ্নের উত্তর দেওয়ার জন্য @ ব্যাকএন সম্পূর্ণ করার জন্য, এখানে একটি শর্ট-লাইনার রয়েছে যা আপনার স্ক্রিপ্টের আর্গুমেন্ট তালিকায় পাইপযুক্ত যুক্তিগুলি প্রিপেন্ড করবে:

#!/bin/bash
args=$@
[[ -p /dev/stdin ]] && { mapfile -t; set -- "${MAPFILE[@]}"; set -- $@ $args; }

echo $@

উদাহরণ ব্যবহার:

$ ./script.sh arg1 arg2 arg3
> arg1 arg2 arg3

$ echo "piped1 piped2 piped3" | ./script.sh
> piped1 piped2 piped3

$ echo "piped1 piped2 piped3" | ./script.sh arg1 arg2 arg3
> piped1 piped2 piped3 arg1 arg2 arg3
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.