Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Lập Trình Bash

Thành Thạo Tham Số Đặc Biệt Bash: 4 Ví Dụ Script Shell Thực Tế

Là một phần của loạt bài hướng dẫn bash đang diễn ra, chúng ta đã thảo luận về tham số vị trí bash trong bài trước. Trong bài này, chúng ta sẽ thảo luận về tham số đặc biệt bash với một vài ví dụ script shell thực tế.

Một số tham số đặc biệt bash chúng ta sẽ thảo luận trong bài này là: $*, $@, $#, $$, $!, $?, $-, $_

Để truy cập toàn bộ danh sách tham số vị trí, hai tham số đặc biệt $* và $@ có sẵn. Bên ngoài ngoặc kép, hai cái này tương đương: Cả hai mở rộng thành danh sách tham số vị trí bắt đầu từ $1 (phân tách bằng khoảng trắng).

Trong ngoặc kép, tuy nhiên, chúng khác nhau: $* trong cặp ngoặc kép tương đương danh sách tham số vị trí, phân tách bằng ký tự đầu tiên của IFS "$1c$2c$3...".

$@ trong cặp ngoặc kép tương đương danh sách tham số vị trí, phân tách bằng khoảng trắng không quote, tức là, "$1" "$2"..."$N".

Ví Dụ 1: Dùng Bash $* Và $@ Mở Rộng Tham Số Vị Trí

Ví dụ này cho thấy giá trị có trong $* và $@.

Đầu tiên, tạo expan.sh như dưới.

$ cat expan.sh
#!/bin/bash
export IFS='-'
cnt=1
# In dữ liệu có trong $*
echo "Values of \"\$*\":"
for arg in "$*"
do
  echo "Arg #$cnt= $arg"
  let "cnt+=1"
done
cnt=1
# In dữ liệu có trong $@
echo "Values of \"\$@\":"
for arg in "$@"
do
  echo "Arg #$cnt= $arg"
  let "cnt+=1"
done

Tiếp theo, thực thi expan.sh như dưới để xem $* và $@ hoạt động như thế nào.

$ ./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
  • Script trên xuất giá trị IFS (Internal Field Separator) với '-'.
  • Có ba tham số truyền cho script expan.sh $1="This is", $2="2" và $3="3".
  • Khi in mỗi giá trị tham số đặc biệt "$*", nó cho chỉ một giá trị là toàn bộ tham số vị trí phân tách bằng IFS.
  • Trong khi "$@" cho bạn mỗi tham số như một từ riêng biệt.

Ví Dụ 2: Dùng $# Đếm Tham Số Vị Trí

$# là tham số đặc biệt trong bash cho số tham số vị trí ở thập phân.

Đầu tiên, tạo arithmetic.sh như dưới.

$ 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"

Nếu số tham số vị trí nhỏ hơn 2, nó ném thông tin usage như dưới,

$ ./arithemetic.sh 10
Usage: ./arithemetic.sh arg1 arg2

Ví Dụ 3: Tham Số Liên Quan Tiến Trình – $$ Và $!

Tham số đặc biệt $$ cho process ID của shell. $! cho process id của tiến trình nền gần nhất thực thi.

Script sau in process id của shell và background process ID thực thi gần nhất.

$ cat proc.sh
#!/bin/bash
echo -e "Process ID=$$"
sleep 1000 &
echo -e "Background Process ID=$!"

Bây giờ, thực thi script trên, và kiểm tra process id nó in.

$ ./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
$

Ví Dụ 4: Tham Số Đặc Biệt Bash Khác – $?, $-, $_

  • $? Cho trạng thái thoát của lệnh gần nhất thực thi.
  • $- Tùy chọn đặt bằng lệnh builtin set
  • $_ Cho đối số cuối của lệnh trước. Khi khởi động shell, nó cho tên file tuyệt đối của script shell đang thực thi.
$ cat others.sh
#!/bin/bash
echo -e "$_";  ## Tên tuyệt đối file đang thực thi
/usr/local/bin/dbhome
# kiểm tra trạng thái thoát của dbhome
if [ "$?" -ne "0" ]; then
  echo "Sorry, Command execution failed !"
fi
echo -e "$-";  # Set options - hB
echo -e $_     # Đối số cuối của lệnh trước.

Trong script trên, câu echo cuối "echo -e $_" (dấu gạch dưới) cũng in hB là giá trị đối số cuối của lệnh trước. Vì vậy $_ sẽ cho giá trị sau mở rộng.

$ ./others.sh
./others.sh
/home/oracle
Sorry, Command execution failed !
hB
hB