Giá trị của $ {# 1} là gì?


9

Vui lòng giải thích cách sử dụng ${#1}dưới đây:

getlable ()     
{
    if (( ${#1} == 0 )); then test="-"; else test="${1}"; fi;
}

1
Chỉ cần tự hỏi: bạn đã bận tâm đặt một 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.
jpmc26

Câu trả lời:


24

${#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 cathoặ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ố, catsẽ 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.


bây giờ đó là cách bạn cung cấp một câu trả lời xuất sắc :)
NGÀY 28/1/2016

4

${#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.

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.