Tôi chỉ muốn hỏi liệu có bất kỳ lệnh nào sẽ hoạt động trên các shell thông thường (bash, dash, kornshell) không? Cần kiểm tra xem linebiến có chứa bất kỳ phần nào của đường dẫn không.
if [[ $line =~ "$PWD"$ ]] ;then
Tôi chỉ muốn hỏi liệu có bất kỳ lệnh nào sẽ hoạt động trên các shell thông thường (bash, dash, kornshell) không? Cần kiểm tra xem linebiến có chứa bất kỳ phần nào của đường dẫn không.
if [[ $line =~ "$PWD"$ ]] ;then
Câu trả lời:
Có, các phiên bản gần đây của bash có thể làm điều này:
$ pwd
/home/terdon
$ line="I'm in /home/terdon"
$ [[ "$line" =~ "$PWD"$ ]] && echo yes
yes
Cú pháp tương tự hoạt động trong zsh và ksh nhưng không phải trong dấu gạch ngang. Theo tôi biết, dash không có khả năng như vậy.
Lưu ý rằng regex của bạn đang kiểm tra xem biến $line kết thúc bằng $PWD. Để kiểm tra xem có $PWDkhớp ở bất cứ đâu trong không $line, hãy xóa $:
$ line="I'm in /home/terdon, are you?"
$ [[ "$line" =~ "$PWD" ]] && echo yes
yes
/home/terdon/foovới zsh, kshvà bash(4.3.25) và nó hoạt động tốt với tất cả chúng. Nó thực sự phá vỡ khi PWDchứa các toán tử regex. Điều đó chỉ đơn giản là không bao giờ xảy ra với tôi, cảm ơn!
Trong mọi vỏ tương thích POSIX, bạn có thể làm:
case $line in (*"$PWD"*)
# whatever your then block had
;;esac
Điều này hoạt động trong bash, dashvà chỉ về bất kỳ shell nào khác mà bạn có thể đặt tên.
Nó cũng có thể được sử dụng để xử lý nhiều khả năng dễ dàng. Ví dụ:
case $line in
(*"$PWD"*)
echo \$PWD match\!
;;
(*"$OLDPWD"*)
echo \$OLDPWD match\!
;;
(*)
! echo no match\!
;;esac
Bạn cũng có thể sử dụng luân phiên:
case $line in (*"$PWD"*|*"$OLDPWD"*)
echo '$OLDPWD|$PWD match!'
;;esac
Lưu ý việc sử dụng trích dẫn ở trên:
case $line ...
casecâu lệnh sẽ không được phân chia trên một trong hai $IFShoặc được sử dụng làm mẫu cho gen tên tệp. Điều này tương tự như cách đối số bên trái trong một [[bài kiểm tra được xử lý.(*"$PWD"*)
$IFShoặc tạo tên tệp - một bản mở rộng không được trích dẫn sẽ không phân chia cũng như toàn cầu.$PWDchứa a *và không được trích dẫn, nó sẽ được hiểu là một đối tượng mẫu và không phải là một nghĩa đen *được tìm kiếm.:bình luận đã gây nhầm lẫn, nhưng tôi sử dụng nó bởi vì nó không gen lỗi cú pháp hoặc vô tình chạy một số proggie tên bất cứ điều gì trong $PATH. Cách này vẫn sẽ gây ra lỗi cú pháp, nhưng ít nhất thì rõ ràng là nó nên.
(:case $line in *"$PWD"*)
zshbóp nghẹt nó.
$(case a in a);; esac)nào?
zsh -cx '(case $1 in $2*) echo ok;;esac)' -- one ohoạt động, nhưng tiền tố : $phá vỡ nó. Tôi đoán đó là vấn đề tôi gặp phải trong quá khứ - nó luôn luôn không rõ ràng và tôi không bao giờ nhìn nó quá khó vì thêm phần ngoài cùng bên trái (luôn cố định nó. Cuối cùng, tôi chỉ viết nó ra như một zshđiều kỳ lạ và biến nó thành một quy tắc để sử dụng cả hai đầu.