Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม BASH

อธิบายพารามิเตอร์พิเศษของ Bash พร้อมตัวอย่างเชลล์สคริปต์ 4 ตัวอย่าง

ในส่วนหนึ่งของชุดการสอน 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

No