तार की सूची के माध्यम से पाश पाश


16

क्या इस नमूने को प्रारूपित करना संभव है:

for i in string1 string2 stringN
do
 echo $i
done

इस के समान कुछ:

for i in 
string1
string2
stringN
do
 echo $i
done

संपादित करें: भ्रम के लिए क्षमा करें, महसूस नहीं किया कि स्क्रिप्ट निष्पादित करने के विभिन्न तरीके थे - श <scriptname>बनाम bash <scriptname>और यह भी कि मैं अभी क्या नाम नहीं दे सकता - #!/bin/shऔर #!/bin/bash:)


आप जिस समस्या को हल करने की कोशिश कर रहे हैं, वह क्या है?
jesse_b

क्या आपने कोशिश की कि आप यह देखने के लिए पूछ रहे हैं कि क्या यह काम करेगा?
डोपघोटी

1
@Jesse_b पठनीयता और तारों के गुच्छा का

@ डोपघोटी हां मैंने किया

@ जवाई: उस मामले में एक सरणी आपकी सबसे अच्छी शर्त है। देखिए ग्लेन जैकमैन का जवाब।
jesse_b

जवाबों:


36

बैश में सरणियों का उपयोग पठनीयता की सहायता कर सकता है: यह सरणी सिंटैक्स शब्दों के बीच मनमाने ढंग से व्हाट्सएप की अनुमति देता है।

strings=(
    string1
    string2
    "string with spaces"
    stringN
)
for i in "${strings[@]}"; do
    echo "$i"
done

1
यह सबसे अधिक सुरुचिपूर्ण लगता है, लेकिन दुर्भाग्य से त्रुटि देता है: सिंटैक्स त्रुटि: "(" अप्रत्याशित

1
@ जवाई, तो आप इसे बैश में नहीं चला रहे हैं। याद रखें कि shजरूरी नहीं है कि बैश हो, और विशेष रूप से डेबियन और उबंटू पर नहीं है।
इलकाछू

1
@ilkachach मुझे लगता है कि मैं इसे अभी प्राप्त करता हूं - "bash <scriptname>" नहीं "sh <scriptname>" चलाना चाहिए: :)

@ जवाई, या एक उचित हैशबैंग / शेबंग लाइन डालकर एक निष्पादन योग्य की तरह चलाएं। आवश्यक पढ़ना: क्या शेबंग उस शेल को निर्धारित करता है जो स्क्रिप्ट चलाता है?
इलकाचू

1
@rrrr, आपके प्रश्नों का उत्तर शायद यहाँ दिया गया है: stackoverflow.com/q/12314451/7552
ग्लेन जैकमैन


3

प्रत्येक आइटम से पहले / बाद में आप लूप से बच सकते हैं:

for i in \
    string1 \
    string2 \
    stringN
do
   printf '%s\n' "$i"
done

या, इस सरल उदाहरण के लिए:

printf '%s\n' string1 string2 stringN

जिसका एक ही परिणाम है।

सम्बंधित:

एक bashसरणी का उपयोग कर भिन्नता :

strings=(
    string1
    string2
    stringN
)

printf '%s\n' "${strings[@]}"


1
list='a b c d'
for element in $list;do 
    echo "$element"
done

आप अर्धविराम याद कर रहे हैं!
४१ --५४

ध्यान दें कि यह तब तक काम करेगा जब तक प्रत्येक स्ट्रिंग एक अलग शब्द है। जैसे ही आपके स्ट्रिंग्स में स्पेस होंगे, स्पेस कई शब्दों में अलग हो जाएगा। इसके अलावा, यदि $listस्ट्रिंग में ग्लोबिंग ग्लोबिंग कैरेक्टर ( list='* * * *') हैं, तो शेल संभावित रूप से मैचिंग फाइलनाम के साथ बदल देगा।
Kusalananda

0

आप यहांloop उपलब्ध कमांड का उपयोग कर सकते हैं , जैसे:

$ loop "echo $ITEM" --for string1,string2,string3

या, यदि आपके पास फ़ाइल के रूप में एक सूची है:

$ cat file_list.txt | loop "echo $ITEM"

0

एक ही बात, कम पाठ:

array=(
        string{1..7}
)

for i in "${array[@]}"; do
    echo "$i"
done

string1आदि को प्रदर्शित करने के लिए शाब्दिक मूल्य नहीं हैं, वे प्लेसहोल्डर हैं, इसलिए यह दृष्टिकोण काम नहीं करता है।
स्टीफन किट

यदि हां, तो परेशान क्यों हो array ( … )? बस करो for i in string{1..7}; do echo "$i"; done; यहां तक ​​किprintf '%s\n' string{1..7}
α12sнιη
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.