Làm thế nào để bạn kiểm tra nếu $*
trống? Nói cách khác, làm thế nào để kiểm tra nếu không có đối số được cung cấp cho một lệnh?
Làm thế nào để bạn kiểm tra nếu $*
trống? Nói cách khác, làm thế nào để kiểm tra nếu không có đối số được cung cấp cho một lệnh?
Câu trả lời:
Để kiểm tra xem không có đối số nào được cung cấp cho lệnh, hãy kiểm tra giá trị của $#
biến sau đó,
if [ $# -eq 0 ]; then
echo "No arguments provided"
exit 1
fi
Nếu bạn muốn sử dụng $*
( không thích hợp hơn ) thì
if [ "$*" == "" ]; then
echo "No arguments provided"
exit 1
fi
Một số giải thích:
Cách tiếp cận thứ hai không thích hợp hơn vì trong mở rộng tham số vị trí mở *
rộng thành các tham số vị trí, bắt đầu từ một. Khi mở rộng xảy ra trong dấu ngoặc kép, nó mở rộng thành một từ duy nhất với giá trị của từng tham số được phân tách bằng ký tự đầu tiên của biến đặc biệt IFS. Điều đó có nghĩa là một chuỗi được xây dựng. Vì vậy, có thêm chi phí.
Mặt khác #
mở rộng đến số lượng tham số vị trí.
Thí dụ:
$ command param1 param2
Đây,
Giá trị $#
là 2 và giá trị của $*
chuỗi là "param1 param2" (không có dấu ngoặc kép), nếu IFS không được đặt. Bởi vì nếu IFS không được đặt, các tham số được phân tách bằng dấu cách
Để biết thêm chi tiết man bash
và đọc chủ đề có tên Thông số đặc biệt
[ $# -eq 0 ]
là hình thức phổ biến nhất IME. Có trường hợp cạnh "$#"
có thể trống: nếu có một đối số trống hoặc nếu có một vài đối số trống và $IFS
trống.
"$*"
mô tả trên cũng sẽ đánh giá để ""
nếu chỉ có một ""
tham số đã được thông qua. Nhưng hầu hết thời gian bạn có thể sẽ không quan tâm đến dù sao.
bash
. Bạn đang sử dụng sh
để thực thi tập lệnh. AFAIK ==
chỉ có giá trị trong bash
.
Nếu bạn chỉ quan tâm đến việc bảo lãnh nếu thiếu một đối số cụ thể, Thay thế tham số là tuyệt vời:
#!/bin/bash
# usage-message.sh
: ${1?"Usage: $0 ARGUMENT"}
# Script exits here if command-line parameter absent,
#+ with following error message.
# usage-message.sh: 1: Usage: usage-message.sh ARGUMENT
đây là một trong những cách bạn có thể biết rằng bạn chưa có bất kỳ đối số nào
NO_ARGS=0
if [ $# -eq "$NO_ARGS" ]; then
{do something}
fi
if ! (($#)); ...
, hoặcif (($# == 0)); ...
, hoặcif [ $# -eq 0 ]; ...
, hoặc! (($#)) && ...
, hoặc(($#)) || ...