Làm thế nào để kiểm tra nếu không có tham số nào được cung cấp cho lệnh?


75

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:


112

Để 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 bashvà đọc chủ đề có tên Thông số đặc biệt


5
Hoặc if ! (($#)); ..., hoặc if (($# == 0)); ..., hoặc if [ $# -eq 0 ]; ..., hoặc ! (($#)) && ..., hoặc(($#)) || ...
nicerobot

7
[ $# -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à $IFStrống.
Gilles

1
Các "$*"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.
manatwork

Tôi tin rằng nó nên = thay vì == ... hiện tại tôi đang gặp lỗi vận hành không mong muốn và thay đổi thành = khắc phục sự cố.
thực sự là

@Charlotte Điều đó có nghĩa là bạn không sử dụng bash. Bạn đang sử dụng shđể thực thi tập lệnh. AFAIK ==chỉ có giá trị trong bash.
Sachin Divekar

14

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

-4

đâ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

5
Đó dường như là một cách làm phức tạp để làm những gì câu trả lời được chấp nhận đã viết 5 năm trước ....
Jeff Schaller
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.