"$ {My_array [@] / # / -}" में किस प्रकार का ऑपरेशन है?


17

किसी कमांड के तर्कों में किसी सरणी को बदलने के लिए स्वीकृत उत्तर ? निम्नलिखित बैश कमांड का उपयोग करता है:

command "${my_array[@]/#/-}" "$1"

मैं यह पता लगाने की कोशिश कर रहा हूं कि /#/-भाग क्या करता है, बिल्कुल। दुर्भाग्य से, मुझे नहीं पता कि इसे क्या कहा जाए, इसलिए मुझे कोई दस्तावेज खोजने में परेशानी हो रही है। मैंने एरेज़ और कुछ वेबसाइटों पर बैश मैन पेज सेक्शन के माध्यम से देखा है, लेकिन कुछ भी नहीं पा सकता है।

जवाबों:


24

इस में पैटर्न प्रतिस्थापन का एक उदाहरण है खोल पैरामीटर विस्तार : ${parameter/pattern/replacement}फैलता है ${parameter}, का पहला उदाहरण की जगह patternके साथ replacement। इस तरह के एक पैटर्न के संदर्भ में, #विशेष है: यह पैरामीटर की शुरुआत के पैटर्न को एंकर करता है। इस सब का अंतिम परिणाम my_arrayसरणी में सभी मानों का विस्तार करना है , -प्रत्येक के लिए प्रीपेडिंग है (प्रत्येक पैरामीटर की शुरुआत में खाली पैटर्न को बदलकर)।


2

हाँ, यह शेल पैरामीटर विस्तार में एक पैटर्न प्रतिस्थापन है :

${parameter/pattern/replacement}

लेकिन अगर पहले के बाद का पहला चरित्र या /तो है या इसका विशेष अर्थ है (बार-बार), और ।/#%allstartend

साथ में:

$ str='one_#two_two_three_one'

एक एकल /पहले उदाहरण की जगह लेगा। का पहला उदाहरण one:

$ echo "${str/one/x-x}"
x-x_#two_two_three_one

या पहला उदाहरण two:

$ echo "${str/two/x-x}"
one_#x-x_two_three_one

oneअंत में उदाहरण :

$ echo "${str/%one/x-x}"
one_#two_two_three_x-x

सभी की पुनरावृत्ति two:

$ echo "${str//two/x-x}"
one_#x-x_x-x_three_one

oneशुरुआत में उदाहरण :

$ echo "${str/#one/x-x}"
x-x_#two_two_three_one

एक स्ट्रिंग जो शुरू होती है #(उद्धरण #):

$ echo "${str/\#two/x-x}"
one_x-x_two_three_one

लेकिन यदि आप # (निर्विरोध) अकेले छोड़ देते हैं, तो परिवर्तन को चर की शुरुआत में सेट किया जाता है:

$ echo "${str/#/====}"
====one_#two_two_three_one

इसके अलावा, यदि पैरामीटर एक सरणी है, तो प्रतिस्थापन सभी तत्वों पर किया जाता है:

$ str=( one two three )
$ echo "${str[@]/#/==}"
==one ==two ==three

शब्दांकन थोड़ा भ्रामक है #और %पैटर्न का हिस्सा है, जबकि उसी पैटर्न //से एक अलग ऑपरेटर है /और इसका उपयोग करते हैं। आपके पास pattern='#x'; echo "${var/$pattern}"(या ${var//$pattern}) हो सकता है, लेकिन pattern=/x; echo "${var/$pattern}"जैसा है वैसा नहीं है echo "${var//x}"। ध्यान दें कि #और %में जोड़ा जा सकता है zsh, लेकिन नहीं bashहै और न ही ksh
स्टीफन चेज़लस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.