#!/bin/bash
FILE="$(basename "$1")"
FILE="${FILE/%.jpeg/.jpg}"
อย่างไรก็ตามมีกาวสองบรรทัดนี้รวมกันเป็นหนึ่งซับ?
#!/bin/bash
FILE="$(basename "$1")"
FILE="${FILE/%.jpeg/.jpg}"
อย่างไรก็ตามมีกาวสองบรรทัดนี้รวมกันเป็นหนึ่งซับ?
คำตอบ:
FILE=$(basename "${1/%.jpeg/.jpg}")
ทำงานให้ฉัน
ทดสอบ:
bash-$ ./test.sh /tmp/foo.jpeg
foo.jpg
เนื้อหาของสคริปต์:
bash-$ cat test.sh
#!/usr/bin/bash
FILE=$(basename "${1/%.jpeg/.jpg}")
echo "$FILE"
คุณไม่สามารถซ้อนการขยายใน bash (หรือเป็น ksh, ash และ shell อื่น ๆ นอกเหนือจาก zsh) นี่เป็นเพียงข้อ จำกัด ด้านเครื่องสำอางเนื่องจากตามที่คุณแสดงคุณสามารถกำหนดนิพจน์กลางให้กับตัวแปรชั่วคราว มันน่ารำคาญนิดหน่อยสำหรับหนึ่ง liners แต่ในสคริปต์มัน arguably ดีกว่าสำหรับการอ่าน
คุณสามารถหลีกเลี่ยงการใช้ยูทิลิตี้ภายนอกbasename
และใช้โครงสร้างการจัดการสตริงแทน:
FILE="${1##*/}"; FILE="${FILE/%.jpeg/.jpg}"
นี่มันเกิดขึ้นที่คุณสามารถเขียนสคริปต์ของคุณไปใส่แทนคำสั่งด้านนอก นั่นไม่ใช่ปรากฏการณ์ทั่วไปหรือคุณไม่ได้อะไรนอกเหนือไปจากความรู้สึกแบบหนึ่งซับ
Zsh ให้ดีขึ้นหรือแย่ลงจะช่วยให้คุณขยายการขยาย:
FILE=${$(basename $1)/%.jpeg/.jpg} # using basename
FILE=${${1##*/}/%.jpeg/.jpg} # using string rewriting
หรือคุณสามารถใช้โครงสร้างภายในของ zsh แทนbasename
:
FILE=${${1:t}/%.jpeg/.jpg}
ฉันจะไปที่:
FILE=$(basename $1 .jpeg).jpg
พารามิเตอร์ที่สองเพื่อ basename เป็นคำต่อท้ายที่จะลบออกจากชื่อไฟล์ (ดูman basename
)
คุณสามารถใช้sed
คำสั่งเดียวดังต่อไปนี้:
FILE=$(sed 's/.*\///;s/\.jpeg$/.jpg/' <<<"$1")
การรวมsed
สิ่งนี้ควรทำเคล็ดลับ:
FILE="$(basename "$1" | sed s/\.jpeg$/.jpg/)"
(สิ่งนี้ไม่ตอบคำถามของคุณอย่างแน่นอนเพราะฉันทำไม่ได้ไม่แน่ใจว่าเป็นไปได้หรือไม่)
Bash ${}
สร้างทำงานกับชื่อตัวแปรดังนั้นจึงไม่มีวิธีการฝังคำสั่งโดยตรง วิธีการของ @ sr_ เป็นทางเลือกถ้าคุณไม่สนใจทางแยก
เส้น
FILE=$(basename "${1/%.jpeg/.jpg}")
สามารถทำให้สั้นลงและทำให้พกพาสะดวกมากขึ้นด้วย
FILE=$(basename "${1%.jpeg}.jpg")
sed
เป็นสิ่งที่เรียบร้อยที่สุด ...