ในส่วนหนึ่งของชุดการสอน bash ที่กำลังดำเนินอยู่ เราได้พูดคุยกันเกี่ยวกับพารามิเตอร์ตำแหน่ง bash ในบทความที่แล้ว ในบทความนี้ให้เราพูดถึงพารามิเตอร์พิเศษของ bash พร้อมตัวอย่างเชลล์สคริปต์ที่ใช้งานได้จริงบางส่วน
พารามิเตอร์พิเศษของ bash บางส่วนที่เราจะพูดถึงในบทความนี้ ได้แก่:$*, $@, $#, $$, $!, $?, $-, $_
ในการเข้าถึงรายการพารามิเตอร์ตำแหน่งทั้งหมด พารามิเตอร์พิเศษสองตัวคือ $* และ $@ จะพร้อมใช้งาน นอกเครื่องหมายอัญประกาศคู่ ทั้งสองมีค่าเท่ากัน:ทั้งคู่ขยายไปยังรายการพารามิเตอร์ตำแหน่งที่เริ่มต้นด้วย $1 (คั่นด้วยการเว้นวรรค)
อย่างไรก็ตาม ภายในเครื่องหมายคำพูดคู่ จะต่างกัน:$* ภายในเครื่องหมายคำพูดคู่เทียบเท่ากับรายการพารามิเตอร์ตำแหน่ง โดยคั่นด้วยอักขระตัวแรกของ IFS “$1c$2c$3…”
$@ ภายในเครื่องหมายคำพูดคู่เทียบเท่ากับรายการพารามิเตอร์ตำแหน่ง คั่นด้วยช่องว่างที่ไม่มีเครื่องหมายคำพูด เช่น “$1” “$2″..”$N”
ตัวอย่างที่ 1:ใช้ Bash $* และ $@ เพื่อขยายพารามิเตอร์ตำแหน่ง
ตัวอย่างนี้แสดงค่าที่มีใน $* และ $@
ขั้นแรก ให้สร้าง expan.sh ดังที่แสดงด้านล่าง
$ cat expan.sh #!/bin/bash export IFS='-' cnt=1 # Printing the data available in $* echo "Values of \"\$*\":" for arg in "$*" do echo "Arg #$cnt= $arg" let "cnt+=1" done cnt=1 # Printing the data available in $@ echo "Values of \"\$@\":" for arg in "$@" do echo "Arg #$cnt= $arg" let "cnt+=1" done
ถัดไป ดำเนินการ expan.sh ดังที่แสดงด้านล่างเพื่อดูว่า $* และ $@ ทำงานอย่างไร
$ ./expan.sh "This is" 2 3 Values of "$*": Arg #1= This is-2-3 Values of "$@": Arg #1= This is Arg #2= 2 Arg #3= 3
- สคริปต์ด้านบนส่งออกค่าของ IFS (Internal Field Separator) ด้วย '-'
- มีพารามิเตอร์สามตัวที่ส่งผ่านไปยังสคริปต์ expan.sh $1=”This is”,$2=”2″ and $3=”3″.
- เมื่อพิมพ์แต่ละค่าของพารามิเตอร์พิเศษ “$*” จะมีเพียงค่าเดียวซึ่งเป็นพารามิเตอร์ตำแหน่งทั้งหมดที่คั่นด้วย IFS
- ในขณะที่ “$@” ให้คุณแต่ละพารามิเตอร์เป็นคำที่แยกจากกัน
ตัวอย่างที่ 2:ใช้ $# เพื่อนับพารามิเตอร์ตำแหน่ง
$# เป็นพารามิเตอร์พิเศษใน bash ซึ่งให้จำนวนพารามิเตอร์ตำแหน่งเป็นทศนิยม
ขั้นแรก ให้สร้าง arithmetic.sh ตามที่แสดงด้านล่าง
$ cat arithmetic.sh #!/bin/bash if [ $# -lt 2 ] then echo "Usage: $0 arg1 arg2" exit fi echo -e "\$1=$1" echo -e "\$2=$2" let add=$1+$2 let sub=$1-$2 let mul=$1*$2 let div=$1/$2 echo -e "Addition=$add\nSubtraction=$sub\nMultiplication=$mul\nDivision=$div\n"
หากจำนวนพารามิเตอร์ตำแหน่งน้อยกว่า 2 จะส่งข้อมูลการใช้งานตามที่แสดงด้านล่าง
$ ./arithemetic.sh 10 Usage: ./arithemetic.sh arg1 arg2
ตัวอย่าง 3:พารามิเตอร์ที่เกี่ยวข้องกับกระบวนการ – $$ และ $!
พารามิเตอร์พิเศษ $$ จะให้ ID กระบวนการของเชลล์ $! ให้ ID กระบวนการของกระบวนการพื้นหลังที่ดำเนินการล่าสุดแก่คุณ
สคริปต์ต่อไปนี้พิมพ์ ID กระบวนการของเชลล์และ ID กระบวนการพื้นหลังที่เรียกใช้ล่าสุด
$ cat proc.sh #!/bin/bash echo -e "Process ID=$$" sleep 1000 & echo -e "Background Process ID=$!"
ตอนนี้ รันสคริปต์ด้านบน และตรวจสอบ id กระบวนการที่มันพิมพ์
$ ./proc.sh Process ID=9502 Background Process ID=9503 $ ps PID TTY TIME CMD 5970 pts/1 00:00:00 bash 9503 pts/1 00:00:00 sleep 9504 pts/1 00:00:00 ps $
ตัวอย่างที่ 4:พารามิเตอร์พิเศษอื่นๆ ของ Bash – $?, $-, $_
- $? ให้สถานะการออกของคำสั่งที่ดำเนินการล่าสุด
- $- ตัวเลือกที่ตั้งค่าโดยใช้คำสั่ง set builtin
- $_ ให้อาร์กิวเมนต์สุดท้ายกับคำสั่งก่อนหน้า เมื่อเริ่มต้นเชลล์ มันให้ชื่อไฟล์ที่แน่นอนของเชลล์สคริปต์ที่กำลังดำเนินการ
$ cat others.sh #!/bin/bash echo -e "$_"; ## Absolute name of the file which is being executed /usr/local/bin/dbhome # execute the command. #check the exit status of dbhome if [ "$?" -ne "0" ]; then echo "Sorry, Command execution failed !" fi echo -e "$-"; #Set options - hB echo -e $_ # Last argument of the previous command.
ในสคริปต์ข้างต้น คำสั่ง echo สุดท้าย “echo -e $_” ($ ขีดล่าง) ยังพิมพ์ hB ซึ่งเป็นค่าของอาร์กิวเมนต์สุดท้ายของคำสั่งก่อนหน้า ดังนั้น $_ จะให้ค่าหลังการขยาย
$ ./others.sh ./others.sh /home/oracle Sorry, Command execution failed ! hB hB