Làm cách nào để tìm số lượng đối số được truyền cho tập lệnh Bash?
Đây là những gì tôi có hiện tại:
#!/bin/bash
i=0
for var in "$@"
do
i=i+1
done
Có cách nào khác (tốt hơn) để làm điều này?
Làm cách nào để tìm số lượng đối số được truyền cho tập lệnh Bash?
Đây là những gì tôi có hiện tại:
#!/bin/bash
i=0
for var in "$@"
do
i=i+1
done
Có cách nào khác (tốt hơn) để làm điều này?
Câu trả lời:
Số lượng đối số là $#
Tìm kiếm nó trên trang này để tìm hiểu thêm: http://tldp.org/LDP/abs/html/iternalvariables.html#ARGLIST
argc
trong các ngôn ngữ giống như C, $#
sẽ là 0
nếu không có đối số nào được chuyển đến tập lệnh, 1
nếu có một đối số, v.v.
#!/bin/bash
echo "The number of arguments is: $#"
a=${@}
echo "The total length of all arguments is: ${#a}: "
count=0
for var in "$@"
do
echo "The length of argument '$var' is: ${#var}"
(( count++ ))
(( accum += ${#var} ))
done
echo "The counted number of arguments is: $count"
echo "The accumulated length of all arguments is: $accum"
bc
, hoặc một cái gì đó khác (ksh93 và zsh cũng có thể làm toán thập phân). Mã của bạn bao gồm các ký hiệu đô la cho một số biến, nhưng không phải mã khác. Bạn nên nhất quán về việc sử dụng chúng hay không. Bên trong (())
chúng không cần thiết. Họ, tuy nhiên, trong các echo
tuyên bố.
để thêm tài liệu tham khảo ban đầu:
Bạn có thể nhận được số lượng đối số từ tham số đặc biệt $#
. Giá trị 0 có nghĩa là "không có đối số". $#
là chỉ đọc.
Khi được sử dụng cùng với shift
để xử lý đối số, tham số đặc biệt $#
sẽ giảm dần mỗi khi Bash Buildin shift
được thực thi.
xem Hướng dẫn tham khảo Bash trong phần 3.4.2 Các thông số đặc biệt :
"Shell xử lý một số tham số đặc biệt. Các tham số này chỉ có thể được tham chiếu "
và trong phần này cho từ khóa $ # "Mở rộng số lượng tham số vị trí theo số thập phân."
Dưới đây là một cách dễ dàng -
mèo đếm được.sh
echo "$@" |awk '{for(i=0;i<=NF;i++); print i-1 }'
Đầu ra:
#./countvariable.sh 1 2 3 4 5 6
6
#./countvariable.sh 1 2 3 4 5 6 apple orange
8
echo "$@" | awk '{print NF}'
i+1
trong biếni
nếu có bất kỳ đối số nào.