ฉันรู้ว่าเชลล์สคริปต์เพียงแค่เรียกใช้คำสั่งราวกับว่าพวกเขาถูกดำเนินการในที่พรอมต์คำสั่ง ฉันต้องการที่จะสามารถเรียกใช้เชลล์สคริปต์ราวกับว่าพวกเขาเป็นฟังก์ชั่น ... นั่นคือการใส่ค่าหรือสตริงลงในสคริปต์ ฉันจะทำสิ่งนี้ได้อย่างไร
ฉันรู้ว่าเชลล์สคริปต์เพียงแค่เรียกใช้คำสั่งราวกับว่าพวกเขาถูกดำเนินการในที่พรอมต์คำสั่ง ฉันต้องการที่จะสามารถเรียกใช้เชลล์สคริปต์ราวกับว่าพวกเขาเป็นฟังก์ชั่น ... นั่นคือการใส่ค่าหรือสตริงลงในสคริปต์ ฉันจะทำสิ่งนี้ได้อย่างไร
คำตอบ:
คำสั่งเปลือกและข้อโต้แย้งใด ๆ กับคำสั่งที่ปรากฏเป็นเลขตัวแปรเปลือก: $0
มีค่าสตริงของคำสั่งของตัวเองบางอย่างเช่นscript
, ./script
, /home/user/bin/script
หรืออะไรก็ตาม ข้อโต้แย้งใด ๆ ที่ปรากฏเป็น"$1"
, "$2"
, "$3"
และอื่น ๆ "$#"
นับเป็นข้อโต้แย้งในตัวแปรเปลือก
วิธีการทั่วไปของการจัดการกับเรื่องนี้เกี่ยวข้องกับคำสั่งเชลล์และgetopts
ฟังก์ชั่นไลบรารี่C มากมาย ย้ายค่าของการ, เพื่อ, และอื่น ๆ ; ได้รับลดลง จบลงด้วยการมองไปที่คุณค่าของรหัสการทำสิ่งต่าง ๆ โดยใช้... เพื่อตัดสินใจเกี่ยวกับการกระทำและจากนั้นทำการย้ายไปยังอาร์กิวเมนต์ถัดไป มันเท่านั้นที่เคยมีการตรวจสอบและอาจshift
getopts
getopt()
shift
$2
$1
$3
$2
$#
"$1"
case
esac
shift
$1
$1
$#
คุณสามารถเข้าถึงผ่านการขัดแย้งกับ$n
ที่n
เป็นจำนวนอาร์กิวเมนต์ 1, 2, 3, ...
- คุณส่งผ่านข้อโต้แย้งเช่นเดียวกับที่คุณทำกับคำสั่งอื่น ๆ
$ cat myscript
#!/bin/bash
echo "First arg: $1"
echo "Second arg: $2"
$ ./myscript hello world
First arg: hello
Second arg: world
$/shellscriptname.sh argument1 argument2 argument3
คุณสามารถส่งผ่านเอาต์พุตของเชลล์สคริปต์หนึ่งเป็นอาร์กิวเมนต์ไปยังเชลล์สคริปต์อื่นได้
$/shellscriptname.sh "$(secondshellscriptname.sh)"
ภายในเชลล์สคริปต์คุณสามารถเข้าถึงอาร์กิวเมนต์ด้วยตัวเลขเช่น$1
อาร์กิวเมนต์แรกและ$2
อาร์กิวเมนต์ที่สองเป็นต้น
แบบฟอร์ม
$ ./script.sh "$@"
argv
เป็นที่สะดวกที่สุดสำหรับ ตัวคั่นหาเรื่องเป็นช่องว่าง แต่สามารถเปลี่ยนแปลงได้ จำไม่ออกว่ามือ จากนั้นใช้
$1, $2, shift, if [ $# -ne 3 ]
เพื่อควบคุมการไหล ฉันมักจะไม่ได้กอด getopts ถ้าcase ... esac
จะพอเพียง
ในสคริปต์ทุบตีฉันชอบใช้สคริปต์ต่อไปนี้เพื่อตั้งค่าพารามิเตอร์:
#!/bin/bash
helpFunction()
{
echo ""
echo "Usage: $0 -a parameterA -b parameterB -c parameterC"
echo -e "\t-a Description of what is parameterA"
echo -e "\t-b Description of what is parameterB"
echo -e "\t-c Description of what is parameterC"
exit 1 # Exit script after printing help
}
while getopts "a:b:c:" opt
do
case "$opt" in
a ) parameterA="$OPTARG" ;;
b ) parameterB="$OPTARG" ;;
c ) parameterC="$OPTARG" ;;
? ) helpFunction ;; # Print helpFunction in case parameter is non-existent
esac
done
# Print helpFunction in case parameters are empty
if [ -z "$parameterA" ] || [ -z "$parameterB" ] || [ -z "$parameterC" ]
then
echo "Some or all of the parameters are empty";
helpFunction
fi
# Begin script in case all parameters are correct
echo "$parameterA"
echo "$parameterB"
echo "$parameterC"
ด้วยโครงสร้างนี้เราไม่พึ่งพาลำดับของพารามิเตอร์เนื่องจากเรากำหนดตัวอักษรหลักให้กับแต่ละตัว นอกจากนี้ฟังก์ชันช่วยเหลือจะถูกพิมพ์ทุกครั้งที่พารามิเตอร์ถูกกำหนดอย่างไม่ถูกต้อง มันมีประโยชน์มากเมื่อเรามีสคริปต์จำนวนมากที่มีพารามิเตอร์แตกต่างกันเพื่อจัดการ มันทำงานได้ดังต่อไปนี้:
$ ./myscript -a "String A" -b "String B" -c "String C"
String A
String B
String C
$ ./myscript -a "String A" -c "String C" -b "String B"
String A
String B
String C
$ ./myscript -a "String A" -c "String C" -f "Non-existent parameter"
./myscript: illegal option -- f
Usage: ./myscript -a parameterA -b parameterB -c parameterC
-a Description of what is parameterA
-b Description of what is parameterB
-c Description of what is parameterC
$ ./myscript -a "String A" -c "String C"
Some or all of the parameters are empty
Usage: ./myscript -a parameterA -b parameterB -c parameterC
-a Description of what is parameterA
-b Description of what is parameterB
-c Description of what is parameterC
./myscript myargument
myargument
กลายเป็นภายใน$1
myscript
ในเชลล์สคริปต์ มันจะกลายเป็นชื่อตัวแปร $ 1 คำที่สองกลายเป็นชื่อตัวแปร $ 2 เป็นต้นไป
cat << 'EOF' > test
echo "First arg: $1"
echo "Second arg: $2"
echo "List of all arg: $@"
EOF
sh test hello world
พบมากขึ้นในคู่มือเชลล์ (sh) ที่http://heirloom.sourceforge.net/sh/sh.1.html
หากคุณคุ้นเคยกับ Python argparse และไม่สนใจโทร python เพื่อแยกอาร์กิวเมนต์ bash ให้ใช้ bash argparse ( https://github.com/mattbryson/bash-arg-parse )
ดูคำตอบเดียวกันได้ที่นี่: https://stackoverflow.com/questions/7069682/how-to-get-arguments-with-flags-in-bash-script/50181287#50181287
#!/bin/bash
echo "First arg: $1"
echo "Second arg: $2"
echo "Your First Argument was $1 & Second Argument was $2" 2> /dev/null
------------------------------------------------------------------------
./scriptname.sh value1 value2
2> /dev/null
2) ไม่ได้เพิ่มคำตอบใด ๆ
getopt()
เป็นมาตรฐานที่กำหนดขึ้นอย่างมาก แต่การgetopt
ปฏิบัติการไม่เหมือนกันใน distro / platform ตอนนี้ฉันเป็นgetopts
ผู้ใช้ที่ถูกแปลงอย่างเต็มที่เนื่องจากเป็นมาตรฐาน POSIX มันใช้งานได้ดีด้วยdash
เช่นกันซึ่งเป็นเชลล์สคริปต์ที่ฉันต้องการ