วิธีรีสตาร์ทสคริปต์อย่างสมบูรณ์จากภายในสคริปต์เอง


22

ฉันกำลังตั้งค่าเชลล์สคริปต์ที่มีเมนูและเมนูย่อยตัวเลือก ฯลฯ แต่ในเมนู / เมนูย่อย / ฯลฯ แต่ละรายการฉันต้องการตัวเลือก "กลับไปที่เมนูหลัก"

ฉันได้รับการตั้งค่าเมนูแล้วและใช้งานได้ดี แต่ฉันต้องการวิธีในการรีสตาร์ทสคริปต์ตั้งแต่เริ่มต้นรีเซ็ตตัวแปรทั้งหมดเป็นต้น

หรือวิธีออกจากสคริปต์ปัจจุบันและเริ่มใหม่อีกครั้ง

ฉันพยายามทำสิ่งนี้:

ScriptLoc=$(readlink -f "$0")
./ScriptLoc

แต่นั่นเริ่มต้นสคริปต์ "ใหม่" ในสคริปต์ "เก่า" ดังนั้นเมื่อฉันออกจากสคริปต์ "ใหม่" สคริปต์จะกลับไปที่สคริปต์ "เก่า" (ถ้าเหมาะสม) มันเป็นสคริปต์ที่อยู่ในประเภทของสคริปต์

ทุกคนมีความคิดวิธีการเริ่มต้นใหม่อย่างสมบูรณ์?


นั่นควรเป็น$ScriptLocอย่างใด: ./ScriptLocค้นหาสคริปต์ของชื่อนั้นในไดเรกทอรีปัจจุบัน
poolie

คำตอบ:



10

คุณสามารถใช้สิ่งนี้:

$(basename $0) && exit

$(basename $0)จะสร้างตัวอย่างใหม่ของสคริปต์ปัจจุบันและexitจะออกจากอินสแตนซ์ curent ของสคริปต์

นี่คือสคริปต์ทดสอบที่เน้นวิธีการด้านบน:

#!/bin/bash

if ! [[ $count =~ ^[0-9]+$ ]] ; then
    export count=0
fi

echo $count

if [ $count -le 10 ]; then
    count=$(echo "$count+1" | bc)   
    ./$(basename $0) && exit #this will run if started from the same folder
fi

echo "This will be printed only when the tenth instance of script is reached"

หากคุณไม่ได้ใช้export count=0(ซึ่งทำให้countเป็นตัวแปรสภาพแวดล้อม) และใช้เท่านั้นcount=0(ซึ่งทำให้contตัวแปรสคริปต์ท้องถิ่น) จากนั้นสคริปต์จะไม่หยุด


&& exitจะออกก็ต่อเมื่อสคริปต์สำเร็จ ดังนั้นหากตัวอย่างสคริปต์ไม่สามารถเรียกใช้งานได้หรือมีข้อผิดพลาดทางไวยากรณ์นี่เป็นเพียงการหมุน
poolie

เพิ่ม. / ไปยังชื่อฐาน - มิฉะนั้นเป็นวิธีการแก้ปัญหาที่สวยงาม - ดีจริงๆให้กำหนด +1
ถนัดมือ G Balogh

4

การได้รับสคริปต์ที่ใช้งานได้ในปัจจุบันนั้นยากกว่าที่คุณคิด ดูhttp://mywiki.wooledge.org/BashFAQ/028

คุณสามารถทำสิ่งนี้แทน:

main_menu() { 
    printf '1. Do something cool\n'
    printf '2. Do something awesome\n'
    : ... etc
}

some_sub_sub_menu() {
    ...
    printf 'X. Return to main menu\n'
    ...
    if [[ $choice = [Xx] ]]; then
        exit 255
    fi
}

while true; do
    (main_menu)
    res=$?
    if (( res != 255 )); then
        break
    fi
done

โดยทั่วไปคุณรันฟังก์ชัน main_menu ใน subshell ดังนั้นหากคุณออกจาก main_menu หรือเมนูย่อยใด ๆ คุณออกจาก subshell ไม่ใช่เชลล์หลัก สถานะการออก 255 ถูกเลือกที่นี่เพื่อหมายถึง "ไปอีกครั้ง" สถานะการออกอื่น ๆ จะแตกออกจากลูปไม่สิ้นสุด

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