การรวมอาร์กิวเมนต์ bash เข้ากับสตริงเดี่ยวด้วยช่องว่าง


39

ฉันพยายามที่จะเข้าร่วมการขัดแย้งทั้งหมดเพื่อฟังก์ชั่น Bash เป็นหนึ่งสายเดียวที่มีช่องว่างแยกแต่ละอาร์กิวเมนต์ ฉันต้องมีสตริงที่มีคำพูดเดียวรอบสตริงทั้งหมด

นี่คือสิ่งที่ฉันมี ...

$array=("$@")
str="\'"
for arg in "${array[@]}"; do
    let $str=$str+$arg+" "
done
let $str=$str+"\'"

เห็นได้ชัดว่านี่ใช้งานไม่ได้ แต่ฉันสงสัยว่ามีวิธีที่จะบรรลุเป้าหมายนี้หรือไม่?

คำตอบ:


53

ฉันเชื่อว่านี่เป็นสิ่งที่คุณต้องการ มันจะทำให้ข้อโต้แย้งทั้งหมดในหนึ่งสตริงคั่นด้วยช่องว่างด้วยคำพูดเดียวรอบทั้งหมด:

str="'$*'"

$*สร้างอาร์กิวเมนต์ของสคริปต์ทั้งหมดที่คั่นด้วยอักขระตัวแรก$IFSซึ่งโดยค่าเริ่มต้นจะมีช่องว่าง

ภายในสตริงที่มีเครื่องหมายคำพูดคู่ไม่จำเป็นต้องหลีกเลี่ยงคำพูดเดียว

ตัวอย่าง

ให้เราใส่ข้างต้นในไฟล์สคริปต์:

$ cat script.sh 
#!/bin/sh
str="'$*'"
echo "$str"

ตอนนี้รันสคริปต์ด้วยอาร์กิวเมนต์ตัวอย่าง:

$ sh script.sh one two three four 5
'one two three four 5'

สคริปต์นี้เป็น POSIX มันจะทำงานร่วมกับแต่มันไม่จำเป็นต้องbashbash

รูปแบบ: การต่อข้อมูลกับเครื่องหมายทับแทนช่องว่าง

เราสามารถเปลี่ยนจากช่องว่างเป็นอักขระอื่นได้โดยการปรับIFS:

$ cat script.sh 
#!/bin/sh
old="$IFS"
IFS='/'
str="'$*'"
echo "$str"
IFS=$old

ตัวอย่างเช่น:

$ sh script.sh one two three four       
'one/two/three/four'

โอเคมันใช้งานได้ดีและทำในสิ่งที่ฉันต้องการ ฉันพยายามใช้สิ่งนี้เพื่อเปลี่ยนไดเรกทอรีเป็นไดเรกทอรีที่มีช่องว่างในชื่อเพียงแค่ใช้อาร์กิวเมนต์ สิ่งที่ฉันต้องการในที่สุดคือการสร้างฟังก์ชั่นที่จะเปลี่ยนไดเรกทอรีโดยไม่ต้องพิมพ์เครื่องหมายวรรคตอนหากไดเรกทอรีมีคำเว้นวรรค สิ่งที่ฉันพยายามคือต่อไปนี้: cdm () {str = "'$ *'" cd $ str} มันเข้าถึงอาร์กิวเมนต์แรกใน str เท่านั้นตัวอย่างเช่น: cdm test 2 ผลลัพธ์: 'test: ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว
Schwagmister

@Schwagmister: คุณสามารถบันทึกลงในตัวแปร (สตริง) หากคุณต้องการ แต่ถ้าคุณไม่ต้องการทำเช่นนั้นโดยเฉพาะฉันคิดว่าcd "$*"จะดีพอ
สกอตต์

@Schwagmister เครื่องหมายคำพูดเดี่ยวไม่มีประโยชน์ ลอง: cdm(){ str="$*"; cd "$str"; }หรือตามที่สกอตต์แนะนำ, cdm(){ cd "$*"; }. นอกจากนี้โปรดระวังว่า$*จะแทนที่ช่องว่างต่อเนื่องหลายช่องด้วยช่องว่างเดียว หากชื่อไดเรกทอรีของคุณอาจมีช่องว่างหรือแท็บหรือบรรทัดใหม่ต่อเนื่องกันหลายตัวอักขระเหล่านั้นจำเป็นต้องได้รับการยกเว้นก่อนที่จะส่งผ่านไปยังcdmฟังก์ชัน
John1024

ดังนั้นถ้ามันเป็นเหมือนการทดสอบ 2 Trial 1 ฉันจะทำให้คำสั่ง cd นี้ทำงานได้อย่างถูกต้องได้อย่างไร? นอกจากนี้ยังเป็นความช่วยเหลือที่น่าอัศจรรย์ฉันขอขอบคุณพวกเขาจริงๆ @Scott
Schwagmister

@Schwagmister วิธีที่ดีที่สุดคือการใส่คำพูดเดียวในบรรทัดคำสั่งเมื่อโทรเช่น:cdm cdm 'test 2 trial 1'นี้จะจัดการคฤหาสน์ของชื่อแปลกทั้งหมด แต่ตราบใดที่ช่องว่างสีขาวจะถูก จำกัด ให้เพียงครั้งเดียวช่องว่างแล้วแล้วก็สามารถใช้เป็นcdm cdm test 2 trial 1
John1024

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