ใช้ '*' ในเชลล์สคริปต์
Oct 14 2020
ฉันพยายามเรียกใช้ตัวอย่างคำสั่ง:
sudo mv /home/vaishnavi/Downloads/*.ttc /home/vaishnavi/Downloads/*.ttf /usr/local/share/fonts/ms_fonts/
ใช้งานได้ดีในเทอร์มินัล แต่เมื่อฉันพยายามเพิ่มสิ่งนี้ในเชลล์สคริปต์ ( .sh) ฉันได้รับข้อผิดพลาดว่า:
mv: cannot stat '/home/vaishnavi/Downloads/*.ttf': No such file or directory
ในกรณีนี้ฉันต้องการย้ายไฟล์ทั้งหมด.ttfและ.ttcพิมพ์ไปที่ /usr/local/share/fonts/ms_fonts/พูดตามตรงว่าฉันไม่ค่อยเชี่ยวชาญเรื่องเชลล์สคริปต์ โปรดอธิบายให้ฉันทราบว่าฉันทำผิดอะไรและเป็นทางเลือกอื่นเพื่อให้บรรลุผลลัพธ์ที่คาดหวัง
สคริปต์ตัวอย่างของฉัน:
sudo mv /home/vaishnavi/Downloads/*.ttc /home/vaishnavi/Downloads/*.ttf /usr/local/share/fonts/ms_fonts/
...
exit 0
คำตอบ
3 glennjackman Oct 14 2020 at 19:32
คุณจะได้รับข้อผิดพลาดนี้หากไม่มีไฟล์ * .ttf อยู่ที่นั่น ตามค่าเริ่มต้นหากไม่มีไฟล์ใดที่ตรงกับรูปแบบ glob รูปแบบนั้นจะยังคงอยู่ในคำสั่ง ปิดสิ่งนี้ด้วยnullglobตัวเลือกbash shell
เพื่อความปลอดภัยยิ่งขึ้นให้ตรวจสอบว่ามีบางไฟล์ที่ต้องย้ายจริงๆ:
#!/usr/bin/env bash
...
shopt -s nullglob
# store files in an array
files=( /home/vaishnavi/Downloads/*.{ttc,ttf} )
# and if the array is not empty, move the files.
if (( ${#files[@]} > 0 )); then sudo mv -t /usr/local/share/fonts/ms_fonts/ "${files[@]}"
fi