Câu trả lời:
${#1}
là độ dài (tính theo số ký tự) trong $1
đó là đối số đầu tiên của hàm.
Vì vậy, (( ${#1} == 0 ))
một cách phức tạp để kiểm tra xem đối số đầu tiên có trống không (hoặc không đặt, các tham số chưa đặt có xuất hiện dưới dạng trống khi mở rộng) hay không.
Để kiểm tra một tham số trống, cách chính tắc là:
[ -z "$1" ]
Nhưng ở đó, nhiều khả năng mục đích là kiểm tra xem một đối số có được cung cấp cho hàm trong trường hợp đó cú pháp sẽ là:
[ "$#" -eq 0 ]
(hoặc (($# == 0))
nếu bạn muốn làm cho tập lệnh của mình ksh / bash / zsh cụ thể).
Tuy nhiên, trong cả hai trường hợp, vỏ giống như Bourne đều có những vết cắt ngắn cho điều đó:
test=${1:--} # set test to $1, or "-" if $1 is empty or not provided
test=${1--} # set test to $1, or "-" if $1 is not provided
Bây giờ, nếu mục đích là chuyển nó sang cat
hoặc tiện ích văn bản khác để -
(có nghĩa là stdin) được thông qua khi không có đối số nào được cung cấp, thì bạn có thể không cần bất kỳ tiện ích nào trong số đó.
Thay vì:
getlable() {
test=${1--}
cat -- "$test"
}
Cứ làm đi:
getlable() {
cat -- "$@"
}
Danh sách đối số cho hàm sẽ được chuyển như nguyên trạng cat
. Nếu không có đối số, cat
sẽ không nhận được đối số (và sau đó đọc từ stdin như thể đó là một -
đối số). Và nếu có một hoặc nhiều đối số thì tất cả sẽ được thông qua cat
.
${#1}
là độ dài của tham số vị trí đầu tiên.
Trong một vỏ đang chạy, bạn có thể sử dụng
set -- foo bar
echo ${#1}
3
để đặt chúng.
echo ${#1}
tuyên bố trước đó để xem giá trị là gì? Nếu vậy, bạn thường nên bao gồm những gì bạn tìm thấy trong nghiên cứu đó trong câu hỏi và có lẽ là một lời giải thích tại sao nó không giúp ích.