বাশ-এর ​​কমান্ডের আউটপুটে আমি কীভাবে একটি পরিবর্তনশীল সেট করব?


1675

আমার কাছে খুব সহজ স্ক্রিপ্ট রয়েছে যা নিম্নলিখিতগুলির মতো:

#!/bin/bash

VAR1="$1"
MOREF='sudo run command against $VAR1 | grep name | cut -c7-'

echo $MOREF

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

স্ক্রিপ্টের মধ্যে চালানো দরকার এমন একটি কমান্ডের ফলাফল কীভাবে নেওয়া যায়, এটি একটি ভেরিয়েবলে সংরক্ষণ করা যায়, এবং তারপরে স্ক্রিনে সেই চলকটি আউটপুট দেয়?


1
সম্পর্কিত সম্পর্কিত স্ট্যাকওভারফ্লো.
com/

40
অন্যদিকে , সমস্ত-ক্যাপগুলি ভেরিয়েবলগুলি অপারেটিং সিস্টেম বা শেল নিজেই অর্থযুক্ত ভেরিয়েবলের জন্য পসিক্স দ্বারা সংজ্ঞায়িত করা হয়, যেখানে কমপক্ষে একটি ছোট হাতের অক্ষরযুক্ত নামগুলি অ্যাপ্লিকেশন ব্যবহারের জন্য সংরক্ষিত থাকে। এইভাবে, অযৌক্তিক দ্বন্দ্ব এড়াতে আপনার নিজের শেল ভেরিয়েবলের জন্য ছোট হাতের নাম ব্যবহার করার কথা বিবেচনা করুন (মনে রাখবেন যে শেল ভেরিয়েবলটি সেট করা কোনও পছন্দ মতো পরিবেশের ভেরিয়েবলকে ওভাররাইট করতে পারে)।
চার্লস ডাফি

1
একটি পরিবর্তনশীল মধ্যে একটি সরাইয়া, ক্যাপচার আউটপুট ঠিক তাই তারপর আপনি করতে পারেন echoপরিবর্তনশীল একটি হল এর বেহুদা ব্যবহার echo, এবং ভেরিয়েবল একটি নিষ্প্রয়োজন ব্যবহার।
ট্রিপলি

1
আরও একদিকে যেমন ভেরিয়েবলগুলিতে আউটপুট সংরক্ষণ করা প্রায়শই অপ্রয়োজনীয়। ছোট, ছোট স্ট্রিংগুলির জন্য আপনাকে আপনার প্রোগ্রামে একাধিকবার উল্লেখ করতে হবে, এটি পুরোপুরি ঠিক আছে, এবং ঠিক যাওয়ার পথে; তবে যেকোন অযৌক্তিক পরিমাণ ডেটা প্রক্রিয়াকরণের জন্য, আপনি নিজের প্রক্রিয়াটি একটি পাইপলাইনে পুনরায় আকার দিতে চান বা একটি অস্থায়ী ফাইল ব্যবহার করতে চান।
ট্রিপলি

উত্তর:


2373

ব্যাকটিক্স ছাড়াও `command`, কমান্ড প্রতিস্থাপনের সাহায্যে $(command)বা করা যেতে পারে "$(command)", যা আমি পড়তে সহজ মনে করি এবং বাসা বাঁধার অনুমতি দেয়।

OUTPUT=$(ls -1)
echo "${OUTPUT}"

MULTILINE=$(ls \
   -1)
echo "${MULTILINE}"

উদ্ধৃতি ( ") বহু-লাইন ভেরিয়েবল মান সংরক্ষণ করার জন্য গুরুত্বপূর্ণ ; এটি একটি অ্যাসাইনমেন্টের ডানদিকে optionচ্ছিক, কারণ শব্দ বিভাজন করা হয় না , সুতরাং OUTPUT=$(ls -1)এটি সূক্ষ্মভাবে কাজ করবে।


58
আমরা মাল্টি লাইন আউটপুট জন্য কিছু বিভাজক সরবরাহ করতে পারি?
আর্যান

20
সাদা স্থান (বা হোয়াইটস্পেসের অভাব) বিষয়গুলি
আলী

8
@ টিএমএইচসি 22, কোঁকড়া ধনুর্বন্ধনীগুলি অপ্রাসঙ্গিক; এটি কেবলমাত্র উদ্ধৃতিগুলি গুরুত্বপূর্ণ যা পুনরায়: echoকমান্ডে যাওয়ার আগে প্রসারণ ফলাফলগুলি স্ট্রিং-বিভক্ত এবং গ্লোব-প্রসারিত কিনা ।
চার্লস ডাফি

4
আহ! তাহলে কোঁকড়া ধনুর্বন্ধনী কোন লাভ আছে?
টিএমএইচসি

14
ভ্যারিয়েবলটি তত্ক্ষণাত্ আরও বেশি অক্ষর অনুসরণ করা হয় যা ভেরিয়েবল নামের অংশ হিসাবে ব্যাখ্যা করা যায় Cur যেমন ${OUTPUT}foo${OUTPUT/foo/bar}
চলকগুলিতে

282

সঠিক উপায়

$(sudo run command)

আপনি যদি কোনও অ্যাস্টোস্ট্রোফ ব্যবহার করতে চান তবে আপনার দরকার `নেই '। এই চরিত্রটিকে "ব্যাকটিক্স" (বা "গুরুতর উচ্চারণ") বলা হয়।

এটার মত:

#!/bin/bash

VAR1="$1"
VAR2="$2"

MOREF=`sudo run command against "$VAR1" | grep name | cut -c7-`

echo "$MOREF"

31
ব্যাকটিক সিনট্যাক্সটি অপ্রচলিত এবং আপনার সত্যিকারের মধ্যে পরিবর্তনশীল ইন্টারপোলেশনের চারপাশে ডাবল কোট লাগাতে হবে echo
ট্রিপলি

10
আমি যুক্ত করব যে উপরের অ্যাসাইনমেন্টে আপনাকে '=' এর আশেপাশের জায়গাগুলি সম্পর্কে সতর্ক থাকতে হবে। আপনার সেখানে কোনও স্পেস থাকবে না, অন্যথায় আপনি একটি অ্যাসাইনমেন্ট পাবেন
zbstof

4
ট্রিপলির মন্তব্য সঠিক। সাইগউইনে (মে 2016), while $()works কাজ করার সময় কাজ করে না । আমি এই পৃষ্ঠাটি না দেখা পর্যন্ত ঠিক করতে পারিনি।
toddwz

2
আপডেট (2018) এ উদাহরণ হিসাবে উদাহরণস্বরূপ প্রশংসা করা হবে।
এডুয়ার্ড

90

কমান্ডগুলি থেকে ভেরিয়েবল সেট করতে আমি কিছু ব্যাশ ট্রিক ব্যবহার করি

২ য় সম্পাদনা 2018-02-12: একটি আলাদা উপায়ে যুক্ত হয়েছে, দীর্ঘকাল ধরে চলমান কাজের জন্য এর নীচে অনুসন্ধান করুন !

2018-01-25 সম্পাদনা করুন: একটি নমুনা ফাংশন যুক্ত করেছে (ডিস্ক ব্যবহার সম্পর্কে ভেরিয়েবল পপুলিংয়ের জন্য)

প্রথমটি সহজ, পুরানো এবং উপযুক্ত way

myPi=`echo '4*a(1)' | bc -l`
echo $myPi 
3.14159265358979323844

বেশিরভাগ ক্ষেত্রে সুসংগত, দ্বিতীয় উপায়

বাসা বাঁধতে ভারী হতে পারে, এজন্য প্রথম বন্ধনী প্রয়োগ করা হয়েছিল

myPi=$(bc -l <<<'4*a(1)')

নেস্টেড নমুনা:

SysStarted=$(date -d "$(ps ho lstart 1)" +%s)
echo $SysStarted 
1480656334

একাধিক ভেরিয়েবল পড়া ( বাশিমিজ সহ )

df -k /
Filesystem     1K-blocks   Used Available Use% Mounted on
/dev/dm-0         999320 529020    401488  57% /

যদি আমি কেবল একটি ব্যবহৃত মান চাই:

array=($(df -k /))

আপনি একটি অ্যারে ভেরিয়েবল দেখতে পেলেন :

declare -p array
declare -a array='([0]="Filesystem" [1]="1K-blocks" [2]="Used" [3]="Available" [
4]="Use%" [5]="Mounted" [6]="on" [7]="/dev/dm-0" [8]="999320" [9]="529020" [10]=
"401488" [11]="57%" [12]="/")'

তারপর:

echo ${array[9]}
529020

তবে আমি এটি পছন্দ করি:

{ read foo ; read filesystem size using avail prct mountpoint ; } < <(df -k /)
echo $using
529020

প্রথম read fooশুধু হবে লাফালাফি হেডার লাইন, কিন্তু শুধুমাত্র এক কমান্ড, আপনি হবে 7 বিভিন্ন পূরণ ভেরিয়েবল:

declare -p avail filesystem foo mountpoint prct size using
declare -- avail="401488"
declare -- filesystem="/dev/dm-0"
declare -- foo="Filesystem     1K-blocks   Used Available Use% Mounted on"
declare -- mountpoint="/"
declare -- prct="57%"
declare -- size="999320"
declare -- using="529020"

অথবা এমনকি:

{ read foo ; read filesystem dsk[{6,2,9}] prct mountpoint ; } < <(df -k /)
declare -p mountpoint dsk
declare -- mountpoint="/"
declare -a dsk=([2]="529020" [6]="999320" [9]="401488")

... সাহসী অ্যারেগুলির সাথেও কাজ করবে :read foo disk[total] disk[used] ...

কিছু ভেরিয়েবল পপুলেশন জন্য নমুনা ফাংশন:

#!/bin/bash

declare free=0 total=0 used=0

getDiskStat() {
    local foo
    {
        read foo
        read foo total used free foo
    } < <(
        df -k ${1:-/}
    )
}

getDiskStat $1
echo $total $used $free

নোটা: declareকেবল পঠনযোগ্যতার জন্য লাইনের প্রয়োজন নেই।

সম্পর্কিত sudo cmd | grep ... | cut ...

shell=$(cat /etc/passwd | grep $USER | cut -d : -f 7)
echo $shell
/bin/bash

(দয়া করে অকেজো এড়ান cat! সুতরাং এটি কেবল একটি কাঁটাচামচ কম:

shell=$(grep $USER </etc/passwd | cut -d : -f 7)

সমস্ত পাইপ ( |) কাঁটাচামচ বোঝায়। যেখানে অন্য একটি প্রক্রিয়া চালাতে হবে, ডিস্ক অ্যাক্সেস করতে হবে, লাইব্রেরি কলগুলি এবং এই জাতীয় কিছু।

সুতরাং sedনমুনার জন্য ব্যবহার করা, কেবলমাত্র একটি কাঁটাচামচের মধ্যে সাব-প্রসেসকে সীমাবদ্ধ করবে :

shell=$(sed </etc/passwd "s/^$USER:.*://p;d")
echo $shell

এবং বাশিজম সহ :

তবে বেশিরভাগ কাজের জন্য, বেশিরভাগ ছোট ফাইলগুলিতেই বাশ কাজটি নিজেই করতে পারত:

while IFS=: read -a line ; do
    [ "$line" = "$USER" ] && shell=${line[6]}
  done </etc/passwd
echo $shell
/bin/bash

অথবা

while IFS=: read loginname encpass uid gid fullname home shell;do
    [ "$loginname" = "$USER" ] && break
  done </etc/passwd
echo $shell $loginname ...

ভেরিয়েবল বিভাজন সম্পর্কে আরও যাচ্ছি ...

আমার উত্তরটি একবার দেখুন কীভাবে আমি ব্যাশের একটি ডিলিমিটারের উপর একটি স্ট্রিং বিভক্ত করব?

বিকল্প: ব্যাকগ্রাউন্ডে দীর্ঘ-চলমান কার্যগুলি ব্যবহার করে কাঁটাচামচ হ্রাস করা

২ য় সম্পাদনা 2018-02-12:

যাতে একাধিক কাঁটাচামচ প্রতিরোধ করা যায়

myPi=$(bc -l <<<'4*a(1)'
myRay=12
myCirc=$(bc -l <<<" 2 * $myPi * $myRay ")

অথবা

myStarted=$(date -d "$(ps ho lstart 1)" +%s)
mySessStart=$(date -d "$(ps ho lstart $$)" +%s)

এই কাজটি সূক্ষ্ম, তবে অনেক কাঁটাচামচ চালানো ভারী এবং ধীর।

এবং কমান্ডগুলি লাইনে লাইনে অনেকগুলি অপারেশন করতে পারে dateএবং bcকরতে পারে !!

দেখা:

bc -l <<<$'3*4\n5*6'
12
30

date -f - +%s < <(ps ho lstart 1 $$)
1516030449
1517853288

সুতরাং প্রতিটি অনুরোধের জন্য একটি নতুন কাঁটাচামচ না করেই আমরা অনেক কাজ করার জন্য একটি দীর্ঘ চলমান পটভূমি প্রক্রিয়াটি ব্যবহার করতে পারি ।

এটি সঠিকভাবে করার জন্য আমাদের কিছু ফাইল বর্ণনাকারী এবং ফিফোস দরকার :

mkfifo /tmp/myFifoForBc
exec 5> >(bc -l >/tmp/myFifoForBc)
exec 6</tmp/myFifoForBc
rm /tmp/myFifoForBc

(অবশ্যই, এফডি 5এবং 6অব্যবহৃত হতে হবে!) ... সেখান থেকে আপনি এই প্রক্রিয়াটি ব্যবহার করতে পারেন:

echo "3*4" >&5
read -u 6 foo
echo $foo
12

echo >&5 "pi=4*a(1)"
echo >&5 "2*pi*12"
read -u 6 foo
echo $foo
75.39822368615503772256

একটি ফাংশন newConnector

আপনি আমার newConnectorফাংশনটি গিটিহব.কম বা আমার নিজের সাইটে দেখতে পাচ্ছেন (গিটহাবের নোট: আমার সাইটে দুটি ফাইল রয়েছে Fun

নমুনা:

. shell_connector.sh

tty
/dev/pts/20

ps --tty pts/20 fw
    PID TTY      STAT   TIME COMMAND
  29019 pts/20   Ss     0:00 bash
  30745 pts/20   R+     0:00  \_ ps --tty pts/20 fw

newConnector /usr/bin/bc "-l" '3*4' 12

ps --tty pts/20 fw
    PID TTY      STAT   TIME COMMAND
  29019 pts/20   Ss     0:00 bash
  30944 pts/20   S      0:00  \_ /usr/bin/bc -l
  30952 pts/20   R+     0:00  \_ ps --tty pts/20 fw

declare -p PI
bash: declare: PI: not found

myBc '4*a(1)' PI
declare -p PI
declare -- PI="3.14159265358979323844"

ফাংশনটি myBcআপনাকে সাধারণ সিনট্যাক্স সহ এবং তারিখের জন্য পটভূমি টাস্কটি ব্যবহার করতে দেয়:

newConnector /bin/date '-f - +%s' @0 0
myDate '2000-01-01'
  946681200
myDate "$(ps ho lstart 1)" boottime
myDate now now ; read utm idl </proc/uptime
myBc "$now-$boottime" uptime
printf "%s\n" ${utm%%.*} $uptime
  42134906
  42134906

ps --tty pts/20 fw
    PID TTY      STAT   TIME COMMAND
  29019 pts/20   Ss     0:00 bash
  30944 pts/20   S      0:00  \_ /usr/bin/bc -l
  32615 pts/20   S      0:00  \_ /bin/date -f - +%s
   3162 pts/20   R+     0:00  \_ ps --tty pts/20 fw

সেখান থেকে, আপনি যদি কোনও পটভূমি প্রক্রিয়া শেষ করতে চান, আপনাকে কেবল এটির এফডি বন্ধ করতে হবে :

eval "exec $DATEOUT>&-"
eval "exec $DATEIN>&-"
ps --tty pts/20 fw
    PID TTY      STAT   TIME COMMAND
   4936 pts/20   Ss     0:00 bash
   5256 pts/20   S      0:00  \_ /usr/bin/bc -l
   6358 pts/20   R+     0:00  \_ ps --tty pts/20 fw

যা প্রয়োজন হয় না, কারণ মূল প্রক্রিয়া শেষ হলে সমস্ত এফডি বন্ধ হয়।


উপরের নেস্টেড নমুনাটি আমি যা খুঁজছিলাম। একটি সহজ উপায় হতে পারে, তবে আমি যা অনুসন্ধান করছিলাম সেটি হল পরিবেশের পরিবর্তনশীলটিতে কোনও ডকারের ধারকটির নাম ইতিমধ্যে উপস্থিত রয়েছে কিনা তা খুঁজে বের করার উপায়। সুতরাং আমার জন্য: EXISTING_CONTAINER=$(docker ps -a | grep "$(echo $CONTAINER_NAME)")আমি যে বিবৃতিটি খুঁজছিলাম তা ছিল।
মকর রাশি 1

2
@ capricorn1 এটি এর অকেজো ব্যবহারecho ; আপনি সহজেই চানgrep "$CONTAINER_NAME"
ট্রিপল করুন


আমি সম্ভবত এখানে কিছু মিস করছি: kubectl get ns | while read -r line; do echo $ লাইন | গ্রেপ মেয়াদ | কাট-ডি '' -f1 ; doneপ্রতিটি $lineখালি লাইন এবং তারপরে প্রিন্ট করে bash: xxxx: command not found। তবে আমি আশা করব যে এটি কেবল প্রিন্ট করেxxx
পেপানোটো

77

যেমন তারা ইতিমধ্যে আপনাকে নির্দেশ করেছে, আপনার 'ব্যাকটিক্স' ব্যবহার করা উচিত।

বিকল্প প্রস্তাবিত এছাড়াও $(command)কাজ করে, এবং এটি পড়া আরও সহজ, তবে মনে রাখবেন যে এটি কেবল বাশ বা কর্নশেলের (এবং সেগুলি থেকে প্রাপ্ত শেলস) সাথে বৈধ, তাই যদি আপনার স্ক্রিপ্টগুলি বিভিন্ন ইউনিক্স সিস্টেমে সত্যিই বহনযোগ্য হতে হয়, তবে আপনি পছন্দ করতে পারেন পুরানো ব্যাকটিক্স স্বরলিপি।


23
তারা স্পষ্টভাবে সতর্ক হয়। ব্যাকটিকগুলি অনেক দিন আগে পসিক্স দ্বারা অবচিত করা হয়েছে; এই সহস্রাব্দ থেকে বেশিরভাগ শেলগুলিতে আরও আধুনিক সিনট্যাক্স পাওয়া উচিত। (এখনও উত্তরাধিকারী পরিবেশের কাশি এইচপি-ইউএক্স কাশি রয়েছে যা নব্বইয়ের দশকের গোড়ার দিকে
দৃ firm়ভাবে

25
ত্রুটিপূর্ণ. $()দুই দশক আগে মানিক হিসাবে POSIX sh এর সাথে সম্পূর্ণ সুসংগত।
চার্লস ডাফি

3
নোট করুন যে /bin/shসোলারিস 10 এ এখনও সনাক্ত করা যায় না $(…)- এবং এএফএইকি সোলারিস 11 এও এটি সত্য।
জোনাথন লেফলার

2
@JonathanLeffler এটা আসলে কোন সোলারিস 11 ক্ষেত্রে দেখা যায় যেখানে /bin/shহয় ksh93
jlliagre

2
@ ট্রিপলি - তিন বছর দেরিতে :-) তবে আমি $()গত 10+ বছর ধরে এইচপি-ইউএক্স-এর পসিক্স শেল ব্যবহার করেছি ।
বব জার্ভিস - মনিকা

54

আমি এটি করার তিনটি উপায় জানি:

  1. ফাংশনগুলি এই জাতীয় কাজের জন্য উপযুক্ত: **

    func (){
        ls -l
    }

    এটা বলে দাও func

  2. এছাড়াও অন্য একটি উপযুক্ত সমাধান বোধগম্য হতে পারে:

    var="ls -l"
    eval $var
  3. তৃতীয়টি সরাসরি ভেরিয়েবল ব্যবহার করছে:

    var=$(ls -l)
    
        OR
    
    var=`ls -l`

আপনি একটি ভাল উপায়ে তৃতীয় সমাধানের আউটপুট পেতে পারেন:

echo "$var"

এবং একটি বাজে উপায়ে:

echo $var

1
প্রথমটি বর্তমানে যেমন দাঁড়িয়ে আছে তেমন প্রশ্নের উত্তর দেবে বলে মনে হয় না এবং দ্বিতীয়টি সাধারণত সন্দেহজনক বলে ধরা হয়।
ট্রিপলি

1
ব্যাশ করার ক্ষেত্রে পুরোপুরি নতুন হিসাবে, কেন "$var"ভাল এবং $varবাজে?
পিটার


30

শুধু আলাদা হতে হবে:

MOREF=$(sudo run command against $VAR1 | grep name | cut -c7-)

22

কোনও ভেরিয়েবল সেট করার সময় নিশ্চিত হয়ে নিন যে = চিহ্ন এর আগে এবং / অথবা পরে আপনার কোনও স্থান নেই । সমস্ত ধরণের সমাধান চেষ্টা করে আক্ষরিক অর্থে এক ঘন্টা সময় কাটাতে! এটি দুর্দান্ত নয়।

সঠিক:

WTFF=`echo "stuff"`
echo "Example: $WTFF"

ত্রুটি "স্টাফ: পাওয়া যায় নি" বা অনুরূপে ব্যর্থ হবে

WTFF= `echo "stuff"`
echo "Example: $WTFF"

2
স্থান সঙ্গে সংস্করণ ভিন্ন কিছু মানে : var=value somecommandরান somecommandদিয়ে varতার পরিবেশ মান value। সুতরাং, খালি (শূন্য-বাইট) মান সহ পরিবেশে var= somecommandরফতানি করা হয়। varsomecommand
চার্লস ডাফি

হ্যাঁ, একটি বাশ গ্যাচা
পিটার মর্টেনসেন

14

আপনি যদি এটি মাল্টলাইন / একাধিক কমান্ড / গুলি দিয়ে করতে চান তবে আপনি এটি করতে পারেন:

output=$( bash <<EOF
# Multiline/multiple command/s
EOF
)

বা:

output=$(
# Multiline/multiple command/s
)

উদাহরণ:

#!/bin/bash
output="$( bash <<EOF
echo first
echo second
echo third
EOF
)"
echo "$output"

আউটপুট:

first
second
third

হেরডোক ব্যবহার করে আপনি আপনার দীর্ঘ একক লাইন কোডটিকে একাধিক রেখায় ভেঙে জিনিসগুলি খুব সহজেই সহজ করতে পারেন। আরেকটি উদাহরণ:

output="$( ssh -p $port $user@$domain <<EOF
# Breakdown your long ssh command into multiline here.
EOF
)"

2
bashকমান্ড প্রতিস্থাপনের ভিতরে দ্বিতীয়টি কী ? আপনি ইতিমধ্যে কমান্ড প্রতিস্থাপন দ্বারা একটি সাবশেল তৈরি করছেন। আপনি যদি একাধিক কমান্ড রাখতে চান তবে এগুলি কেবল নিউলাইন বা সেমিকোলন দ্বারা পৃথক করুন। output=$(echo first; echo second; ...)
ট্রিপলি

তারপরে একইভাবে 'bash -c "bash -c \"bash -c ...\""'"আলাদা "ও হবে; কিন্তু আমি এর বিন্দু দেখতে পাচ্ছি না।
ট্রিপলই

@ ট্রিপলি হেরডোক এর অর্থ এর চেয়েও বেশি কিছু। আপনি কিছু অন্যান্য কমান্ডের মতো একই কাজটি করতে পারেন যেমন ssh sudo -sমাইএসকিএল কমান্ডগুলি অভ্যন্তরীণ সম্পাদন করা ইত্যাদি ইত্যাদি ((বাশের পরিবর্তে)
জাহিদ

1
আমি মনে করি না আমরা সঠিকভাবে যোগাযোগ করছি। আমি উপযোগের উপর variable=$(bash -c 'echo "foo"; echo "bar"')দিয়ে চ্যালেঞ্জ করছি variable=$(echo "foo"; echo "bar")- এখানে ডকুমেন্টটি কেবল একটি উদ্ধৃতিপ্রযুক্তি এবং এটি অন্য কোনও অযথা জটিলতা ব্যতীত অন্য কিছু যুক্ত করে না।
ট্রিপলি

2
আমি যখন ssh দিয়ে হেরডোক ব্যবহার করি, সতর্কতা ssh -p $port $user@$domain /bin/bash <<EOFরোধ করার জন্য চালানোর কমান্ডটি আমি যথাযথভাবে Pseudo-terminal will not be allocated because stdin is not a terminal.
জানাই

9

আপনারও ব্যবহার করা দরকার

$(command-here)

অথবা

`command-here`

উদাহরণ

#!/bin/bash

VAR1="$1"
VAR2="$2"

MOREF="$(sudo run command against "$VAR1" | grep name | cut -c7-)"

echo "$MOREF"


1
আমি জানতাম না আপনি বাসা বাঁধতে পারেন তবে এটি সঠিক ধারণা দেয়, তথ্যের জন্য আপনাকে অনেক ধন্যবাদ!
দিয়েগো ভেলিজ

6

এটি অন্য একটি উপায় এবং এমন কিছু পাঠ্য সম্পাদকদের সাথে ব্যবহার করা ভাল যা আপনার তৈরি প্রতিটি জটিল কোড সঠিকভাবে হাইলাইট করতে অক্ষম:

read -r -d '' str < <(cat somefile.txt)
echo "${#str}"
echo "$str"

এটি ওপির প্রশ্নের সাথে মোকাবিলা করে না, যা সত্যই কমান্ড প্রতিস্থাপন সম্পর্কিত , বিকল্প প্রতিস্থাপন নয়
কোডফোরস্টার

6

আপনি ব্যাকটিক্স (অ্যাকসেন্ট কবর নামেও পরিচিত) বা ব্যবহার করতে পারেন $()

ভালো লেগেছে:

OUTPUT=$(x+2);
OUTPUT=`x+2`;

উভয়ের একই প্রভাব রয়েছে। তবে OUTPUT = $ (x + 2) আরও পঠনযোগ্য এবং সর্বশেষ।


2
বাসা বাঁধার অনুমতি দেওয়ার জন্য প্যারেন্টেসিস প্রয়োগ করা হয়েছিল।
এফ। হাউরি

5

আপনি যে কমান্ডটি কার্যকর করতে চেষ্টা করছেন তা যদি ব্যর্থ হয় তবে এটি আউটপুটটিকে ত্রুটি প্রবাহে লিখবে এবং তারপরে কনসোলে মুদ্রিত হবে।

এড়াতে, আপনাকে অবশ্যই ত্রুটি প্রবাহটি পুনর্নির্দেশ করতে হবে:

result=$(ls -l something_that_does_not_exist 2>&1)

4

কেউ কেউ এটি দরকারী মনে হতে পারে। পরিবর্তনশীল প্রতিস্থাপনের পূর্ণসংখ্যার মান, যেখানে কৌশলটি $(())ডাবল বন্ধনী ব্যবহার করছে :

N=3
M=3
COUNT=$N-1
ARR[0]=3
ARR[1]=2
ARR[2]=4
ARR[3]=1

while (( COUNT < ${#ARR[@]} ))
do
  ARR[$COUNT]=$((ARR[COUNT]*M))
  (( COUNT=$COUNT+$N ))
done

1
এটি এই প্রশ্নের কোনও প্রাসঙ্গিকতা বলে মনে হয় না। এটি যদি কোনও স্থির ফ্যাক্টর দ্বারা কোনও অ্যারেতে সংখ্যাটি কীভাবে করা যায় এমন জিজ্ঞাসা করা একটি যুক্তিসঙ্গত উত্তর হবে, যদিও আমি কখনও কাউকে for ((...))এমনটি জিজ্ঞাসা করতে দেখিনি (এবং তারপরে একটি লুপটি লুপ ভেরিয়েবলের জন্য আরও ভাল ম্যাচের মতো মনে হবে) )। এছাড়াও, আপনার ব্যক্তিগত ভেরিয়েবলগুলির জন্য আপনার বড় বড় ব্যবহার করা উচিত নয়।
ট্রিপলি

আমি "প্রাসঙ্গিকতা" অংশের সাথে একমত নই। প্রশ্নটি পরিষ্কারভাবে পড়ে: বাশ-এর ​​কমান্ড থেকে আউটপুটের সমান একটি ভেরিয়েবল কীভাবে সেট করবেন? এবং আমি এই উত্তরটিকে পরিপূরক হিসাবে যুক্ত করেছি কারণ আমি এখানে এমন একটি সমাধান খুঁজছি যা পরে পোস্ট করা কোডটি আমাকে সহায়তা করেছিল। বড় হাতের ভার্স সম্পর্কে, এর জন্য ধন্যবাদ।
Gus

1
এটি লিখিত হতে পারে ARR=(3 2 4 1);for((N=3,M=3,COUNT=N-1;COUNT < ${#ARR[@]};ARR[COUNT]*=M,COUNT+=N)){ :;}তবে আমি @ ট্রিপলির সাথে একমত: আমি বুঝতে পারি না এটি সেখানে কী করে!
এফ। হাউরি

@ এফ.হৌরি ... বাশ আরও বেশি গভীর হয়ে উঠছে আপনি যত গভীরে প্রবেশ করছেন!
রোব্লগিক

4

এখানে আরও দুটি উপায় রয়েছে:

দয়া করে মনে রাখবেন যে বাশে স্থানটি খুব গুরুত্বপূর্ণ। সুতরাং, আপনি যদি আপনার কমান্ডটি চালিত করতে চান তবে আর কোনও স্পেস চালু না করে যেমন ব্যবহার করুন।

  1. নিম্নলিখিতটি এটিকে নিযুক্ত harshilকরে Lএবং তারপরে মুদ্রণ করে

    L=$"harshil"
    echo "$L"
  2. নিম্নলিখিতটি কমান্ডের আউটপুট trএল 2 তে নির্ধারণ করে । trঅন্য ভেরিয়েবল, এল 1 এ পরিচালনা করা হচ্ছে।

    L2=$(echo "$L1" | tr [:upper:] [:lower:])

4
1. $"..."সম্ভবত আপনি যা ভাবেন তা করেন না । ২. এটি ইতিমধ্যে অ্যান্ডি লেস্টার এর উত্তরে দেওয়া আছে।
gniourf_gniourf

@gniourf_gniourf ঠিক আছে: দেখুন ব্যাশ স্থানীয়করণ মাল্টিলিনগুলির সাথে কাজ করবে না । কিন্তু অধীনে ব্যাশ , আপনি ব্যবহার করতে পারে echo ${L1,,}downcase, অথবা echo ${L1^^}upcase করতে।
এফ হাউরি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.