Câu trả lời:
$-
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 set
lệ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 i
ký 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.
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
.
#*i
có 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 i
giá 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