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 line
biế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 line
biế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ó $PWD
khớ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/foo
với zsh
, ksh
và 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 PWD
chứ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
, dash
và 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 ...
case
câu lệnh sẽ không được phân chia trên một trong hai $IFS
hoặ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"*)
$IFS
hoặ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.$PWD
chứ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"*)
zsh
bóp nghẹt nó.
$(case a in a);; esac)
nào?
zsh -cx '(case $1 in $2*) echo ok;;esac)' -- one o
hoạ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.