Làm cách nào để tìm số lượng đối số được truyền cho tập lệnh Bash?


182

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?


4
Mã đó chỉ đơn giản là lưu trữ chuỗi ký tự i+1trong biến inếu có bất kỳ đối số nào.
Phi

Câu trả lời:



99
#!/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"

Nó cũng giúp tôi, điều mà tôi đang cố gắng làm là; #! / bin / bash Count = 0 sum = 0 avg = 0 cho var trong "$ @" do ((sum + = $ var)) ((đếm ++)) đã thực hiện ((avg = sum / $ Count)) echo " tổng các số là: $ sum "echo" trung bình của các số là: $ avg "giúp tôi có được số lượng không xác định của các đối số và thực hiện một số phép toán (bạn có thể chỉnh sửa toán hạng) Cảm ơn Dennis Williamson, tôi đã làm được. Tôi đang đăng lên mã bởi vì nó có thể hữu ích cho ai đó.
kaan yılmaz

1
@ kaanyılmaz: Vấn đề duy nhất với điều đó là Bash chỉ thực hiện số học số nguyên. Nếu bạn muốn số thập phân, bạn sẽ cần sử dụng AWK 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 echotuyên bố.
Tạm dừng cho đến khi có thông báo mới.

Tôi không giỏi lắm với linux, tôi chỉ sửa đổi mã của bạn khi tôi cần. Đó là mã của bạn về cơ bản
kaan yılmaz

Cảm ơn mã, nó là rất tốt.
Smeterlink

12

để 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."


-1

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

3
Có thể được viết làecho "$@" | awk '{print NF}'
user000001

-6

giá trị đó được chứa trong biến $#


4
Ngoài thực tế có câu trả lời gần như chính xác (nhưng đúng) 4 năm tuổi, câu trả lời của bạn là sai - nên là$#
nachteil
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.