นี่คือเฟรมเวิร์กสำหรับการเขียนสคริปต์ทุบตีที่ยอมรับตัวเลือกและ/หรืออาร์กิวเมนต์ กำหนดตัวเลือกและข้อโต้แย้งที่สคริปต์ของคุณยอมรับโดยใช้ไวยากรณ์การประกาศอย่างง่ายและให้ bash-args :
ได้รับการออกแบบมาให้ใช้งานง่าย หลีกเลี่ยงปัญหา และมอบประสบการณ์การใช้งานที่สวยงาม
มีเป้าหมายที่จะพกพาได้ โดยชุดทดสอบจะผ่าน bash >= 3.2 เวอร์ชันหลักๆ ทั้งหมด
หากต้องการใช้ bash-args ในสคริปต์ของคุณ เพียงแหล่งที่มาของไฟล์ init.sh
นี่คือตัวอย่างสคริปต์ eval-command.sh
:
#! /usr/bin/env bash
# Summary : My first bash script using bash-args.
#
# Description : This takes a command as argument, and runs it.
#
# Argument : command
#
# Options :
#
# % dry-run
# desc="Don't execute, just print."
# short="n" type="flag" variable="dry_run" value=1 default=0
#
# % directory
# desc="The directory in which to run the command." argument=directory
# short="d" type="option" variable="directory" default="$(pwd)"
#
. path/to/bash-args/init.sh
# After sourcing the script, you can use the $directory and the $dry_run
# variables to get the values of the options typed (or not) in the command line.
# The other arguments are available as standard bash arguments $1, $2, etc.
command= " cd $directory && $1 "
if [[ $dry_run -eq 1 ]] ; then
echo " $command "
else
eval " $command "
fi
ลองรันคำสั่งนี้ด้วยตัวเลือก:
$ eval-command.sh --dry-run --directory /home 'echo hello'
cd /home && echo hello
คุณสามารถใช้ตัวเลือกแบบสั้นและสามารถจัดกลุ่มได้:
$ eval-command.sh -nd /home 'echo hello'
cd /home && echo hello
ตั้งค่าแท็บให้เสร็จสิ้นด้วยคำสั่งง่ายๆ:
$ eval $(eval-command.sh _register_completion)
มีหน้าช่วยเหลือ:
$ eval-command.sh --help
My first bash script using bash-args.
Usage : eval-command.sh [OPTIONS] [COMMAND]
This takes a command as argument, and runs it.
Options :
--help | -h
Show this help.
--dry-run | -n
Don't execute, just print.
--directory | -d [DIRECTORY]
The directory in which to run the command.
Bash-args ยังสามารถจัดการคำสั่งย่อยได้:
main-script.sh help subcmd1
หรือ main-script.sh subcmd1 --help
เพื่อให้สิ่งนี้เกิดขึ้น ให้เรียกใช้ฟังก์ชัน cmd_run
ที่ส่วนท้ายของสคริปต์หลักของคุณ และกำหนดคำสั่งย่อยโดยเพิ่มเชลล์สคริปต์ลงในไดเร็กทอรี cmd/
โครงสร้างโครงการของคุณควรมีลักษณะดังนี้:
main-script.sh
cmd/
- subcmd1.sh
- subcmd2.sh
หากต้องการบันทึกคำสั่งย่อย และกำหนดตัวเลือกและอาร์กิวเมนต์ ให้เขียนข้อมูลเมตาในช่องความคิดเห็นแรกของคำสั่งย่อยแต่ละคำสั่ง เช่นเดียวกับในสคริปต์หลัก
ตัวเลือกที่กำหนดไว้ในสคริปต์หลักจะพร้อมใช้งานสำหรับคำสั่งย่อยทั้งหมด ในขณะที่ตัวเลือกที่กำหนดไว้ในคำสั่งย่อยจะพร้อมใช้งานสำหรับคำสั่งย่อยเฉพาะนี้เท่านั้น
ข้อมูลเมตาของสคริปต์เป็นไปตามไวยากรณ์ง่ายๆ: ในช่องความคิดเห็นแรก แต่ละบรรทัดที่ขึ้นต้นด้วยคำที่ตามด้วยเครื่องหมายอัฒภาคจะกำหนดฟิลด์ใหม่ และทุกสิ่งที่ตามหลังเครื่องหมายอัฒภาคจะกำหนดค่าของฟิลด์ บรรทัดต่อไปนี้ จนถึงจุดเริ่มต้นของฟิลด์ถัดไป จะถูกผนวกเข้ากับค่า
นี่คือฟิลด์ที่ใช้โดย bash-args
--version
ที่พิมพ์ชื่อและเวอร์ชันตัวเลือกต่างๆ ได้รับการกำหนดไว้ในข้อมูลเมตา ของตัวเลือก เช่นเดียวกับในสคริปต์ตัวอย่าง:
# Options :
#
# % dry-run
# desc="Don't execute, just print."
# short="n" type="flag" variable="dry_run" value=1 default=0
#
# % directory
# desc="The directory in which to run the command." argument=directory
# short="d" type="option" variable="directory" default="$(pwd)"
#
ตัวเลือกเริ่มต้นด้วย %
ตามด้วยชื่อ ชื่อตัวเลือกต้องมีเฉพาะอักขระตัวอักษรและตัวเลข _
หรือ -
บรรทัดต่อไปนี้จะกำหนดพารามิเตอร์ของตัวเลือก เมื่อสคริปต์ถูกรัน นี่จะประเมินเป็นโค้ดทุบตีจริงๆ ตัวแปรที่กำหนดคือพารามิเตอร์ของตัวเลือก ซึ่งหมายความว่าจะใช้กฎการเสนอราคาทั่วไปสำหรับสตริง และคุณสามารถกำหนดตัวเลือกแบบไดนามิกได้ ดังตัวอย่างด้านบน โดยที่พารามิเตอร์ default
ของตัวเลือก directory
ถูกตั้งค่าเป็น $(pwd)
ตัวเลือก จะต้อง กำหนดอย่างน้อย type
และ variable
ตัวแปร :
type
สามารถเป็นได้ทั้ง flag
หรือ option
แฟล็กไม่ยอมรับข้อโต้แย้ง แต่ตัวเลือกยอมรับvariable
คือชื่อตัวแปรที่ค่าอาร์กิวเมนต์ของตัวเลือกจะมีอยู่ในสคริปต์ของคุณตัวเลือก อาจ กำหนดพารามิเตอร์อื่นๆ เหล่านี้:
desc
คือคำอธิบายของตัวเลือกที่ใช้ในหน้าวิธีใช้short
คือตัวอักษรตัวเดียว ใช้สำหรับตัวเลือกแบบสั้นargument
คือประเภทอาร์กิวเมนต์ ดูประเภทอาร์กิวเมนต์default
คือค่าที่ตัวเลือกใช้เมื่อไม่ได้ระบุตัวเลือกในคำสั่งที่พิมพ์โดยผู้ใช้value
คือค่าที่ตัวเลือกใช้เมื่อ มี การระบุตัวเลือก แต่ไม่มีอาร์กิวเมนต์ รับประกันตัวแปรที่กำหนดโดยตัวเลือกในสคริปต์ของคุณ : หาก bash-args ไม่พบค่าสำหรับตัวเลือก ตัวแปรจะออกพร้อมกับข้อผิดพลาด ซึ่งหมายความว่าหากคุณไม่ระบุ default
ของตัวเลือก การเรียกใช้สคริปต์หลักโดยไม่มีตัวเลือกนี้จะทำให้เกิดข้อผิดพลาดอีกครั้ง
กล่าวอีกนัยหนึ่ง หากคุณไม่ต้องการตัวเลือกที่จำเป็น ให้กำหนดพารามิเตอร์ default
ในคำจำกัดความ
พารามิเตอร์ value
ทำงานในลักษณะเดียวกัน หากคุณไม่ได้ระบุ ตัวเลือกนี้จะต้องมีอาร์กิวเมนต์เมื่อใช้ หากคุณทำเช่นนั้น ตัวเลือกจะสามารถใช้ได้โดยไม่มีข้อโต้แย้ง
ตัวเลือกแฟล็กทำงานในลักษณะเดียวกัน และเนื่องจากไม่มีอาร์กิวเมนต์ คุณต้องกำหนดทั้งพารามิเตอร์ default
และ value
Bash-args สามารถจัดการการเติมข้อความอัตโนมัติสำหรับสคริปต์ของคุณโดยใช้ API การเติมข้อมูลให้สมบูรณ์ของ Bash หากต้องการเปิดใช้งานการเติมข้อมูลอัตโนมัติสำหรับคำสั่งของคุณให้รันคำสั่งต่อไปนี้:
eval $( my-command.sh _register_completion )
การเติมแท็บให้สมบูรณ์จะแนะนำตัวเลือกที่กำหนดไว้หากคำ ณ จุดเริ่มต้นด้วย -
และแนะนำคำสั่งย่อยและอาร์กิวเมนต์เป็นอย่างอื่น
หากต้องการบอก bash-args ว่าจะแนะนำอะไรเป็นอาร์กิวเมนต์ คุณต้องระบุ ประเภทอาร์กิวเมนต์ ในข้อมูลเมตา Argument
ของสคริปต์ของคุณ (หรือคำสั่งย่อย) หรือในพารามิเตอร์ argument
ของตัวเลือก
นี่คือประเภทอาร์กิวเมนต์ในตัว:
หากต้องการสร้างประเภทอาร์กิวเมนต์ใหม่และตั้งค่าสำหรับการเติมข้อมูลอัตโนมัติ ให้กำหนดฟังก์ชันที่เรียกว่า _complete_my_arg_type
ฟังก์ชันนี้ต้องพร้อมใช้งานสำหรับสคริปต์ init.sh
ดังนั้นจึงต้องมีการกำหนด ก่อน ไฟล์ . init.sh
บรรทัด . init.sh
ฟังก์ชั่นการทำให้เสร็จสมบูรณ์ควรจะเพิ่มคำแนะนำลงในอาร์เรย์ COMP_REPLIES
ส่วนกลาง พวกเขาได้รับคำปัจจุบัน ณ จุดเป็นพารามิเตอร์เพื่อความสะดวก แต่คุณยังสามารถใช้ตัวแปรโกลบอล COMP_LINE
และ COMP_POINT
ได้ เช่นเดียวกับในสคริปต์การจบการทุบตีทั้งหมด
นี่คือวิธีการกำหนดประเภทอาร์กิวเมนต์ ของไฟล์ :
_complete_file () {
# $1 is the word being typed that we want to complete.
for file in " ${1-} " * ; do
# add each file to the completion candidates.
COMP_REPLIES+=( " $file " )
done
}