लिनक्स बैश में स्ट्रिंग्स में पर्यावरण चर और ब्रैकेट विस्तार को कैसे संयोजित करें?


0

मैं एक बैश स्क्रिप्ट लिखना चाहूंगा जो इस तरह एक डायरेक्टरी स्ट्रक्चर बनाएगी:

foo
 | - innerdir1
 | - innerfile1

विभिन्न निर्देशिका फू नामों के लिए इस क्रिया को कई बार दोहराया जाना चाहिए। प्रत्येक फू नाम में दो भाग होते हैं। इसलिए मुझे लगता है कि मुझे सबसे पहले पर्यावरण चर सेट करने की आवश्यकता है:

    $BAR=something
    $BAZ=anotherthing

और फिर मुझे उन्हें एक स्क्रिप्ट में उपयोग करने की आवश्यकता है जो $ $ BAR की तरह फू के नाम के साथ उल्लिखित संरचना का उत्पादन करेगी। $ BAZ, अर्थात् कुछ। मैं इस तरह की स्क्रिप्ट कैसे लिखूं?

जवाबों:


2
for BAR in abc def
do
    for BAZ in ghi jkl mno
    do
        mkdir -p "$BAR.$BAZ/innerdir1"
        touch "$BAR.$BAZ/innerfile1"
    done
done

बनाएगा:

abc.ghi
 | - innerdir1
 | - innerfile1
abc.jkl
 | - innerdir1
 | - innerfile1
abc.mno
 | - innerdir1
 | - innerfile1
def.ghi
 | - innerdir1
 | - innerfile1
def.jkl
 | - innerdir1
 | - innerfile1
def.mno
 | - innerdir1
 | - innerfile1

0

पर्यावरण चर के बजाय, अपने नाम को तर्क के रूप में पारित करें और इन तर्कों का उपयोग करने के लिए स्क्रिप्ट लिखें - जो अधिक लचीला उपकरण बना देगा।

इस बैश-गाइड पेज और अन्य स्थानों getoptsपर 'लुकअप' ।


0

लिपी:

#!/bin/bash
if [ -z "$BAR" -o -z "$BAZ" ]; then
  echo "This script needs environment variables $BAR and $BAZ to be set."
  exit 1 
fi

dir=$BAR.$BAZ
mkdir $dir
mkdir $dir/innerdir1
touch $dir/innerfile1

इस रूप में आमंत्रित करें:

BAR=bar BAZ=baz ./script.sh

यह बनाएगा: bar.baz/innerdir1और bar.baz/innerfile1


अच्छा विचार - लेकिन इसके लिए $ BAR और $ BAZ सेट होना आवश्यक है - mkdir शुरू करने से पहले इन मूल्यों का परीक्षण करना बेहतर होगा। जैसे अगर [-n $ BAR]
एंड्रियास रेहम

@ संकेत: दिखाया गया निमंत्रण उन मूल्यों को निर्धारित करता है। हालाँकि, स्क्रिप्ट विफल हो जाएगी और .यदि वे सेट नहीं हैं तो निर्देशिका बनाने का प्रयास करेंगे - इसलिए आप सही हैं - स्क्रिप्ट में कुछ परीक्षण शामिल होने चाहिए।
डेनिस विलियमसन

@Dennis, @Andreas: तय
whitequark

अब वह परीक्षण $BARऔर $BAZफाइलों के रूप में मौजूद नहीं है। इसमें कहा गया है, "अगर इसमें निहित नाम के साथ एक फ़ाइल है $BAR और$BAZ तब निहित नाम के साथ एक फ़ाइल एक त्रुटि जारी करती है।" परीक्षण यह परीक्षण करने के लिए होना चाहिए [ -z "$BAR" -o -z "$BAZ" ]कि क्या चर का मान है।
डेनिस विलियमसन

0

आपकी नजर होनी चाहिए

http://tldp.org/LDP/abs/html/arrays.html

एक सरल शुरुआत होगी:

#!/bin/bash

# define foo array
FOOLIST=()

# can be repeated

# create foonames
BAR="something"
BAZ="anotherthing"

# add to foolist
FOOLIST+=("${BAR}.${BAZ}")

BAR="somethingnew"
FOOLIST+=("2${BAR}.${BAZ}")

BAR="somethingnewer"
FOOLIST+=("3${BAR}.${BAZ}")

# create folders from list
for folder in ${FOOLIST[@]}
do
        mkdir $folder
        mkdir $folder/innerdir1
        mkdir $folder/innerfile1
done

आप इस तरह से और अधिक आसानी से एक सरणी में आइटम जोड़ सकते हैं:array+=(item)
डेनिस विलियमसन

आप सही हैं - यह आसान है ...
एंड्रियास रेहम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.