मैं बैश में एक कमांड के आउटपुट में एक चर कैसे सेट कर सकता हूं?


1675

मेरे पास एक बहुत ही सरल स्क्रिप्ट है जो निम्नलिखित की तरह है:

#!/bin/bash

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

echo $MOREF

जब मैं इस स्क्रिप्ट को कमांड लाइन से चलाता हूं और इसे तर्क देता हूं, तो मुझे कोई आउटपुट नहीं मिल रहा है। हालाँकि, जब मैं $MOREFचर के भीतर निहित कमांड चलाता हूं, तो मैं आउटपुट प्राप्त करने में सक्षम हूं।

एक कमांड के परिणामों को कोई कैसे ले सकता है जिसे स्क्रिप्ट के भीतर चलाने की आवश्यकता है, इसे एक चर पर सहेजें, और फिर उस चर को स्क्रीन पर आउटपुट करें?


1
एक संबंधित प्रश्न stackoverflow.com/questions/25116521/…
संदीपन नाथ

40
एक तरफ के रूप में, ऑल-कैप्स चर को ऑपरेटिंग सिस्टम या शेल के अर्थ वाले चर नामों के लिए POSIX द्वारा परिभाषित किया गया है, जबकि कम से कम एक लोअरकेस वर्ण वाले नाम एप्लिकेशन उपयोग के लिए आरक्षित हैं। इस प्रकार, अनपेक्षित संघर्षों से बचने के लिए अपने स्वयं के शेल चर के लिए लोअरकेस नामों का उपयोग करने पर विचार करें (यह ध्यान में रखते हुए कि शेल चर सेट करना किसी भी तरह के नामित पर्यावरण चर को अधिलेखित कर देगा)।
चार्ल्स डफी

1
एक तरफ के रूप में, एक चर में आउटपुट कैप्चरिंग बस इतना है कि आप तब echoचर का एक बेकार उपयोग है echo, और चर का एक बेकार उपयोग कर सकते हैं ।
ट्रिपल

1
एक और के रूप में, चर में उत्पादन भंडारण अक्सर अनावश्यक है। छोटे, छोटे तारों के लिए आपको अपने कार्यक्रम में कई बार संदर्भ देने की आवश्यकता होगी, यह पूरी तरह से ठीक है, और जाने का तरीका ठीक है; लेकिन किसी भी मात्रा में डेटा के प्रसंस्करण के लिए, आप अपनी प्रक्रिया को एक पाइपलाइन में बदलना चाहते हैं, या एक अस्थायी फ़ाइल का उपयोग करना चाहते हैं।
ट्रिपल जे १ee ’१

जवाबों:


2375

बैकटिक्स के अलावा `command`, कमांड प्रतिस्थापन के साथ किया जा सकता है $(command)या "$(command)", जिसे मुझे पढ़ना आसान लगता है, और घोंसले के शिकार के लिए अनुमति देता है।

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

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

बहु-पंक्ति चर मानों" को संरक्षित करने के लिए उद्धरण ( ) मायने रखता है ; यह एक असाइनमेंट के दाईं ओर वैकल्पिक है, क्योंकि शब्द विभाजन का प्रदर्शन नहीं किया गया है , इसलिए OUTPUT=$(ls -1)यह ठीक काम करेगा।


58
क्या हम मल्टी लाइन आउटपुट के लिए कुछ विभाजक प्रदान कर सकते हैं?
आर्यन

20
श्वेत स्थान (या व्हाट्सएप की कमी) मायने रखता है
अली

8
@ timhc22, घुंघराले ब्रेसिज़ अप्रासंगिक हैं; यह केवल ऐसे उद्धरण हैं जो महत्वपूर्ण पुन: हैं: क्या विस्तार परिणाम स्ट्रिंग-स्प्लिट और ग्लोब-विस्तारित हैं जो echoकमांड को पास किए जाने से पहले हैं ।
चार्ल्स डफी

4
आह धन्यवाद! तो क्या घुंघराले ब्रेसिज़ का कोई लाभ है?
तैमुक

14
घुंघराले ब्रेसिज़ का उपयोग तब किया जा सकता है जब चर को तुरंत अधिक वर्णों द्वारा पीछा किया जाता है जिसे चर नाम के हिस्से के रूप में व्याख्या किया जा सकता है। उदा ${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) में, `` काम करते समय $()काम नहीं करता है। जब तक मैंने यह पृष्ठ नहीं देखा, ठीक नहीं कर सका।
टोड्वेज़

2
अपडेट (2018) पर एक उदाहरण जैसे विस्तार की सराहना की जाएगी।
एडुआर्ड

90

कुछ बैश ट्रिक्स जिनका उपयोग मैं कमांड से वेरिएबल्स सेट करने के लिए करता हूं

दूसरा संपादन २०१ at-०२-१२: एक अलग तरह से जोड़ा गया, लंबे समय से चल रहे कार्यों के लिए इसके नीचे खोज करें !

2018-01-25 संपादित करें: एक नमूना फ़ंक्शन जोड़ा (डिस्क उपयोग के बारे में चर आबादी के लिए)

पहला सरल, पुराना और संगत तरीका

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 ...

परिवर्तनशील बंटवारे के बारे में आगे ...

मेरे जवाब पर एक नज़र डालें कि मैं बैश में एक सीमांकक पर एक स्ट्रिंग कैसे विभाजित करूं?

वैकल्पिक: लंबे समय से चल रहे कार्यों का उपयोग करके कांटे कम करना

2 संपादित करें 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फ़ंक्शन GitHub.Com या मेरी स्वयं की साइट पर मिल सकता है (नोट GitHub पर: मेरी साइट पर दो हैं। फ़ंक्शन और डेमो को एक फ़ाइल में बंडल किया गया है जिसे उपयोग के लिए खट्टा किया जा सकता है या बस डेमो के लिए चलाया जा सकता है।)

नमूना:

. 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

वहाँ से, यदि आप पृष्ठभूमि की किसी एक प्रक्रिया को समाप्त करना चाहते हैं, तो आपको बस इसकी fd को बंद करना होगा :

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

जिसकी आवश्यकता नहीं है, क्योंकि मुख्य प्रक्रिया समाप्त होने पर सभी fd बंद हो जाते हैं।


ऊपर नेस्टेड नमूना वह है जो मैं देख रहा था। एक सरल तरीका हो सकता है, लेकिन मैं जो देख रहा था वह यह पता लगाने का तरीका था कि क्या एक डॉकटर कंटेनर पहले से ही एक पर्यावरण चर में अपना नाम दिया गया है। इसलिए मेरे लिए: EXISTING_CONTAINER=$(docker ps -a | grep "$(echo $CONTAINER_NAME)")वह कथन था जिसकी मुझे तलाश थी।
मकर

2
@ capricorn1 यह एक बेकार उपयोग हैecho ; आप बस चाहते हैंgrep "$CONTAINER_NAME"
ट्रिपल 20


मुझे शायद यहाँ कुछ याद है: kubectl get ns | while read -r line; do echo $ लाइन | grep टर्म | cut -d '' -f1 ; doneप्रत्येक के लिए $lineएक खाली लाइन और फिर प्रिंट करता है bash: xxxx: command not found। हालांकि मैं उम्मीद होती है कि यह सिर्फ बाहर प्रिंटxxx
papanito

77

जैसा कि वे आपको पहले ही संकेत दे चुके हैं, आपको 'बैकटिक्स' का उपयोग करना चाहिए।

वैकल्पिक प्रस्तावित के $(command)रूप में अच्छी तरह से काम करता है, और यह भी पढ़ने में आसान है, लेकिन ध्यान दें कि यह केवल बैश या कॉर्नशेल (और उन से प्राप्त गोले) के साथ मान्य है, इसलिए यदि आपकी स्क्रिप्ट को विभिन्न यूनिक्स प्रणालियों पर वास्तव में पोर्टेबल होना चाहिए, तो आपको पसंद करना चाहिए पुराने backticks संकेतन।


23
वे अत्यधिक सतर्क हैं। बहुत समय पहले POSIX द्वारा बैकटिक्स को हटा दिया गया है; इस सहस्राब्दी से अधिकांश गोले में अधिक आधुनिक वाक्यविन्यास उपलब्ध होना चाहिए। (अभी भी विरासत के वातावरण खांसी HP-UX खांसी हैं जो नब्बे के दशक की शुरुआत में मजबूती से फंसे हुए हैं।)
ट्रिपल

25
गलत। $()POSIX श के साथ पूरी तरह से संगत है, जैसा कि दो दशक पहले मानकीकृत था।
चार्ल्स डफी

3
ध्यान दें कि /bin/shसोलारिस 10 पर अभी भी मान्यता नहीं है $(…)- और AFAIK कि सोलारिस 11 पर भी सच है।
जोनाथन लेफ़लर

2
@JonathanLeffler यह वास्तव में सोलारिस 11 के साथ कोई और मामला नहीं /bin/shहै ksh93
jlliagre

2
@tripleee - तीन साल देर से प्रतिक्रिया :-) लेकिन मैंने $()पिछले 10+ वर्षों से HP-UX पर POSIX शेल में उपयोग किया है।
बॉब जार्विस - मोनिका

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निर्यात कर रहा varहै somecommand
चार्ल्स डफी

हां, एक बैश गेटा।
पीटर मॉर्टेंसन

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 ...\""'"अलग" भी होगा; लेकिन मुझे उस की बात नहीं दिख रही है।
ट्रिपलए

@tripleee heredoc का अर्थ इससे कुछ अधिक है। आप कुछ अन्य कमांड के साथ भी ऐसा कर सकते हैं, जैसे कि ssh sudo -sअंदर mysql कमांड निष्पादित करना, आदि .. (bash के बजाय)
Jahid

1
मुझे नहीं लगता कि हम ठीक से संवाद कर रहे हैं। मैं अधिक variable=$(bash -c 'echo "foo"; echo "bar"')से अधिक उपयोगिता को चुनौती दे रहा हूं variable=$(echo "foo"; echo "bar")- यहां दस्तावेज़ सिर्फ एक उद्धृत तंत्र है और वास्तव में एक और बेकार जटिलता के अलावा कुछ भी नहीं जोड़ता है।
ट्रिपलए

2
जब मैं ssh के साथ heredoc का उपयोग करता हूं, तो मैं चेतावनी ssh -p $port $user@$domain /bin/bash <<EOFको रोकने के लिए चलाने की आज्ञा देता हूंPseudo-terminal will not be allocated because stdin is not a terminal.
F. Hauri

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 ((...))लूप लूप चर के लिए एक बेहतर मैच की तरह प्रतीत होगा। )। इसके अलावा, आपको अपने निजी चर के लिए अपरकेस का उपयोग नहीं करना चाहिए।
ट्रिपलए

मैं "प्रासंगिकता" भाग से असहमत हूं। प्रश्न स्पष्ट रूप से पढ़ता है: बैश में एक कमांड से आउटपुट के बराबर चर कैसे सेट करें? और मैंने इस उत्तर को एक पूरक के रूप में जोड़ा क्योंकि मैं यहां एक समाधान की तलाश में था जिसने मुझे बाद में पोस्ट किए गए कोड के साथ मदद की। अपरकेस vars के बारे में, इसके लिए धन्यवाद।
गस

1
यह लिखा जा सकता है ARR=(3 2 4 1);for((N=3,M=3,COUNT=N-1;COUNT < ${#ARR[@]};ARR[COUNT]*=M,COUNT+=N)){ :;}लेकिन मैं @tripleee से सहमत हूं: मुझे समझ में नहीं आता कि यह क्या है, वहां!
एफ। हौरी

@ F.Hauri ... बैश और अधिक हो रहा है और अधिक आप इसे में जाना है!
22

4

यहाँ दो और तरीके हैं:

कृपया ध्यान रखें कि बैश में स्थान बहुत महत्वपूर्ण है। इसलिए, यदि आप चाहते हैं कि आपकी कमांड चलें, तो उपयोग करें बिना किसी और स्थान को शुरू किए।

  1. निम्नलिखित इसे असाइन करता harshilहै Lऔर फिर प्रिंट करता है

    L=$"harshil"
    echo "$L"
  2. निम्नलिखित trL2 को कमांड का आउटपुट प्रदान करता है । trएक अन्य चर, L1 पर संचालित किया जा रहा है।

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

4
1. $"..."शायद वह नहीं करता है जो आपको लगता है कि यह करता है । 2. यह एंडी लेस्टर के जवाब में पहले से ही दिया गया है।
गनीउरफ_गनीउरफ

@gniourf_gniourf सही है: देखें बैश स्थानीयकरण मल्टीलाइन के साथ काम नहीं करेगा । लेकिन बैश के तहत , आप नीचे echo ${L1,,}या ऊपर echo ${L1^^}चढ़ने के लिए उपयोग कर सकते हैं ।
एफ। होरी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.