2015-05-26 46 views
5

Tôi đã xem mã sau và thấy rằng cả $ # và $ {# @} đều in cùng một giá trị. Ai đó có thể cho tôi biết sự khác biệt giữa hai người là gì?

# length.sh 

E_NO_ARGS=65 

if [ $# -eq 0 ] # Must have command-line args to demo script. 
then 
    echo "Please invoke this script with one or more command-line arguments." 
    exit $E_NO_ARGS 
fi 

var01=abcdEFGH28ij 
echo "var01 = ${var01}" 
echo "Length of var01 = ${#var01}" 
# Now, let's try embedding a space. 
var02="abcd EFGH28ij" 
echo "var02 = ${var02}" 
echo "Length of var02 = ${#var02}" 

echo "Number of command-line arguments passed to script = ${#@}" 
echo "Number of command-line arguments passed to script = $#" 

exit 0 
+3

thực tế tôi nghĩ rằng không có sự khác biệt. '$ #' là số đối số dòng lệnh, '$ @' có hiệu quả là một mảng của các đối số dòng lệnh và '$ {# @}' là độ dài của mảng này - chúng phải có cùng giá trị. –

+3

Lưu ý rằng thực tế là '$ {# @}' mở rộng đến số tham số vị trí là một bashism. Tiêu chuẩn POSIX để lại '$ {# @}' và '$ {# *}' không xác định. – chepner

Trả lời

8

mỗi nhãn hiệu trang (3.5.3 Shell Parameter Expansion):

${#parameter}

dài Parameter. Độ dài ký tự của giá trị tham số được thay thế. Nếu tham số là * hoặc @, giá trị được thay thế là số tham số vị trí. Nếu tham số là tên mảng được chỉ định bởi * hoặc @, giá trị được thay thế là số phần tử trong mảng.

Vì vậy, ${#@} chỉ là trường hợp đặc biệt vì $# là cách thông thường để biểu thị số tham số vị trí.

Các vấn đề liên quan