Bash Shell Script การประมวลผลตัวเลือก: เพิ่ม -all และ -q (เงียบ), บังคับใช้การทำซ้ำ


0

ฉันกำลังเขียนสคริปต์ Bash ที่ใช้ตัวเลือก N เรียกพวกเขาว่า -1, -2, ... , -N ต่อไปนี้ใช้กับการใช้ตัวเลือก:

  • อาจมีตัวเลือกจำนวนเท่าใดก็ได้ตั้งแต่ 0 - N
  • ไม่มีตัวเลือกที่จะโต้แย้งใด ๆ
  • ตัวเลือกอาจมีให้ในลำดับใด ๆ

ฉันดำเนินการตามวิธีมาตรฐาน:

while [[ $# -gt 0 ]]
do
   OPTION="$1"

   case $OPTION in
      -1)
         process_option_1
         shift
         ;;
      -2)
         process_option_2
         shift
         ;;
      ...
      -N)
         process_option_N
         shift
         ;;
      *)
         echo "Unknown option $OPTION. Aborting..."
         exit 1
   esac
done

เป้าหมาย 1

ฉันต้องการเพิ่มสองตัวเลือกเพิ่มเติม:

  • พัก นี่หมายถึง -1, -2, ... -N
  • -q นี่หมายถึงโหมด "เงียบ" คือไม่พิมพ์อะไรไปยังจอแสดงผล

ถ้า พัก จะต้องปรากฏด้วยตัวเองหรือด้วย -q เท่านั้น

-q อาจใช้กับ " พัก รูปแบบการเรียก "หรือ" -1 -2 ... -N "

เป้าหมาย 2

ฉันต้องการบังคับใช้ว่าไม่มีตัวเลือกซ้ำ

คำถาม

ฉันมีเวลายากที่จะขยายตรรกะเพื่อบรรลุเป้าหมาย

ฉันต้องการถามชุมชน: ฉันจะบรรลุเป้าหมายเหล่านี้ได้อย่างไร

โปรดทราบว่าเป้าหมาย 2 เป็นเป้าหมายรอง หากใครบางคนมีทางออกสำหรับเป้าหมาย 1 แต่ไม่ใช่สำหรับเป้าหมาย 2 โดยทั้งหมดโปรดระบุ!

แก้ไขเพื่อเพิ่ม: ฉันสามารถเดรัจฉานบังคับตรรกะ; สิ่งที่ฉันหมายถึงคือฉันกำลังมองหาวิธีแก้ปัญหาที่สะอาดและสง่างามที่ไม่เกี่ยวข้องกับการวนซ้ำตัวเลือกที่ไม่จำเป็นซึ่งให้การรวมอัตโนมัติของการประมวลผลสำหรับตัวเลือกใหม่ ๆ

คำตอบ:


0

ฉันคิดว่านี่สามารถทำงานได้ (ไม่ได้ทดสอบ)

# Use flags to set options on or off.
opt_1=0
opt_2=0
opt_N=0
opt_q=0
all=0

# Goal 2, make options unique.
set -- $(echo $@|tr ' ' '\n'|sort -u)

# Test for -q option.
if [[ "$@" =~ -q ]]; then
opt_q=1
set -- $(echo ${@/-q/})
fi

# Goal 1, -q already processed if present, see if -all is alone.
if [[ "$@" =~ -all ]] && [ "$#" -ne 1 ]; then
echo -all only by itself or with -q
exit
fi

while [ -n "$1" ]; do
case "$1" in
-1)opt_1=1;;
-2)opt_2=1;;
-N)opt_N=1;;
-all)all=1;;
esac
shift
done

if [ "$opt_q" -eq 1 ]; then
exec 1>/dev/null 2>&1
fi

if [ "$opt_1" -eq 1 ] || [ "$all" -eq 1 ]; then
# do stuff for -1
fi

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