Computer >> Máy Tính >  >> Lập trình >> Lập trình BASH

Giải thích các tham số đặc biệt của Bash với 4 tập lệnh Shell mẫu

Là một phần của loạt bài hướng dẫn bash đang thực hiện của chúng tôi, chúng tôi đã thảo luận về các tham số vị trí bash trong bài viết trước của chúng tôi. Trong bài viết này, hãy cùng chúng tôi thảo luận về các tham số đặc biệt của bash với một vài ví dụ về tập lệnh shell thực tế.

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

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

Tuy nhiên, trong dấu ngoặc kép, chúng khác nhau:$ * trong một cặp dấu ngoặc kép tương đương với danh sách các tham số vị trí, được phân tách bằng ký tự đầu tiên của IFS “$ 1c $ 2c $ 3…”.

$ @ trong một cặp dấu ngoặc kép tương đương với danh sách các tham số vị trí, được phân tách bằng dấu cách không có dấu ngoặc kép, tức là “$ 1” “$ 2 ″ ..” $ N ”.

Ví dụ 1:Sử dụng Bash $ * và $ @ để mở rộng các tham số vị trí

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

Đầu tiên, tạo expan.sh như hình dưới đây.

$ 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

Tiếp theo, thực thi expan.sh như hình dưới đây để 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
  • Tập lệnh trên đã xuất giá trị của IFS (Dấu phân tách trường nội bộ) bằng dấu ‘-‘.
  • Có ba tham số được truyền cho script expan.sh $ 1 =”Đây là”, $ 2 =”2 ″ và $ 3 =” 3 ″.
  • Khi in từng giá trị của tham số đặc biệt “$ *”, nó chỉ cung cấp một giá trị là toàn bộ tham số vị trí được phân cách bởi IFS.
  • Trong khi “$ @” cung cấp cho bạn mỗi thông số dưới dạng một từ riêng biệt.

Ví dụ 2:Sử dụng $ # để Đếm các Tham số Vị trí

$ # là tham số đặc biệt trong bash cung cấp cho bạn số lượng tham số vị trí ở dạng thập phân.

Đầu tiên, tạo arithmetic.sh như hình dưới đây.

$ 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ố lượng tham số vị trí nhỏ hơn 2, nó sẽ hiển thị thông tin sử dụng như hình dưới đây,

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

Ví dụ 3:Các tham số liên quan đến quy trình - $$ và $!

Tham số đặc biệt $$ sẽ cung cấp ID tiến trình của trình bao. $! cung cấp cho bạn id quy trình của quy trình nền được thực thi gần đây nhất.

Tập lệnh sau sẽ in id quy trình của trình bao và ID quy trình nền thực thi cuối cùng.

$ cat proc.sh
#!/bin/bash

echo -e "Process ID=$$"

sleep 1000 &

echo -e "Background Process ID=$!"

Bây giờ, hãy thực thi tập lệnh trên và kiểm tra id quy trình mà nó đang 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:Các tham số đặc biệt khác của Bash - $ ?, $ -, $ _

  • $? Cung cấp trạng thái thoát của lệnh được thực hiện gần đây nhất.
  • $ - Các tùy chọn được đặt bằng cách sử dụng lệnh nội trang đặt
  • $ _ Cung cấp đối số cuối cùng cho lệnh trước đó. Khi khởi động shell, nó cung cấp tên tệp tuyệt đối của tập lệnh shell đang được thực thi.
$ 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.

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

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