Không có nghĩa là $ $ {- # * i}!


37

Trong /etc/profiletôi thấy điều này:

for i in /etc/profile.d/*.sh ; do
if [ -r "$i" ]; then
        if [ "${-#*i}" != "$-" ]; then
            . "$i"
        else
            . "$i" >/dev/null 2>&1
        fi
    fi
done

${-#*i}nghĩa là gì Tôi không thể tìm thấy một định nghĩa về việc mở rộng tham số bắt đầu ${-.

Câu trả lời:


40

$-là các cờ tùy chọn hiện tại được thiết lập bởi chính shell, trong lệnh gọi hoặc sử dụng setlệnh dựng sẵn:

$ echo $-
himBH
$ set -a
$ echo $-
ahimBH

"${-#*i}"là cú pháp để loại bỏ chuỗi: (từ tài liệu POSIX )

$ {tham số # [từ]}

Xóa mẫu tiền tố nhỏ nhất. Từ này sẽ được mở rộng để tạo ra một mô hình. Việc mở rộng tham số sau đó sẽ dẫn đến tham số, với phần nhỏ nhất của tiền tố khớp với mẫu đã bị xóa. Nếu có, từ sẽ không bắt đầu bằng '#' không được trích dẫn.

$ {tham số ## [từ]}

Xóa mẫu tiền tố lớn nhất. Từ này sẽ được mở rộng để tạo ra một mô hình. Việc mở rộng tham số sau đó sẽ dẫn đến tham số, với phần lớn nhất của tiền tố khớp với mẫu đã bị xóa.

Vì vậy, ${-#*i}loại bỏ chuỗi ngắn nhất cho đến iký tự đầu tiên :

$ echo "${-#*i}"
mBH

Trong trường hợp của bạn, if [ "${-#*i}" != "$-" ]kiểm tra xem vỏ của bạn có tương tác hay không.


23

Có một tham số shell $-. Trong trường hợp của tôi:

$ echo $-
himB

${-}là giống như $-chính xác như ${foo}là giống như $foo.

#*icó nghĩa là: Xóa (càng ít càng tốt; không tạo ra sự khác biệt ở đây) từ đầu giá trị biến cho đến khi (bao gồm) giá trị đầu tiên i.

$ echo "${-#*i}"
mB

Nói cách khác: [ "${-#*i}" != "$-" ]kiểm tra xem có một igiá trị của $-biến hay không, nghĩa là nó kiểm tra xem shell có tương tác hay không.

Nói cách khác, đó là một cách viết tương thích phức tạp và không Bourne:

case $- in
  *i*) ...;;
  *) ...;;
esac

4
POSIX tương thích , mặc dù.
grawity
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.