การดำเนินการประเภทใด / # / - ใน“ $ {my_array [@] / # / -}”?


17

คำตอบที่ได้รับการยอมรับในการแปลงอาร์เรย์เป็นอาร์กิวเมนต์ของคำสั่ง? ใช้คำสั่ง Bash ต่อไปนี้:

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

ฉันพยายามที่จะคิดออกว่า/#/-ส่วนทำอย่างไร น่าเสียดายที่ฉันไม่รู้จะเรียกมันว่าอะไรดังนั้นฉันมีปัญหาในการค้นหาเอกสารใด ๆ ฉันดูในหน้า Bash man page ในอาร์เรย์และเว็บไซต์ไม่กี่แห่ง แต่ไม่พบอะไรเลย

คำตอบ:


24

นี่คือตัวอย่างของการเปลี่ยนรูปแบบในการขยายตัวพารามิเตอร์เปลือก : ${parameter/pattern/replacement}ขยาย${parameter}เปลี่ยนตัวอย่างแรกของด้วยpattern replacementในบริบทของรูปแบบชนิด#นี้พิเศษ: มันยึดรูปแบบกับจุดเริ่มต้นของพารามิเตอร์ ผลลัพธ์สุดท้ายของทั้งหมดนี้คือการขยายค่าทั้งหมดในmy_arrayอาเรย์เตรียม-ต่อให้กับแต่ละอัน (โดยการแทนที่รูปแบบที่ว่างเปล่าที่จุดเริ่มต้นของแต่ละพารามิเตอร์)


2

ใช่มันเป็นการแทนที่รูปแบบในการขยายพารามิเตอร์เชลล์ดังนี้:

${parameter/pattern/replacement}

แต่ถ้าตัวอักษรตัวแรกหลังจากที่ครั้งแรก/เป็นอย่างใดอย่างหนึ่ง/หรือ#หรือ%ว่ามันมีความหมายพิเศษall(ซ้ำ) และstartend

ด้วย:

$ 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
Stéphane Chazelas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.