Shell

Shell 測試以在字元串中查找模式

  • September 26, 2019

我只是想問一下是否有任何命令可以在常見的 shell(bash、dash、kornshell)上執行?它應該檢查line變數是否包含路徑的任何部分。

if [[ $line =~ "$PWD"$ ]] ;then

是的,最新版本的 bash 可以做到這一點:

$ pwd
/home/terdon
$ line="I'm in /home/terdon"
$ [[ "$line" =~ "$PWD"$ ]] && echo yes
yes

相同的語法在 zsh 和 ksh 中有效,但在 dash 中無效。據我所知,dash 沒有這樣的能力。

請注意,您的正則表達式正在檢查變數是否$line . $PWD要檢查是否$PWD匹配 中$line的任何位置,請刪除$

$ line="I'm in /home/terdon, are you?"
$ [[ "$line" =~ "$PWD" ]] && echo yes
yes

在任何與 POSIX 兼容的 shell 中,您可以執行以下操作:

case $line in (*"$PWD"*)
#    whatever your then block had
;;esac

這適用於bash,dash和幾乎任何您可以命名的 shell。

它也可以用來輕鬆處理多種可能性。例如:

case $line in 
(*"$PWD"*)
   echo \$PWD match\!
;;
(*"$OLDPWD"*)
   echo \$OLDPWD match\!
;;
(*)
   ! echo no match\!
;;esac

您還可以使用交替:

case $line in (*"$PWD"*|*"$OLDPWD"*)
   echo '$OLDPWD|$PWD match!'
;;esac

注意上面引用的用法:

  1. case $line ...
  • 語句的對像case不會被拆分$IFS或用作文件名 gen 的模式。這類似於[[測試中左參數的處理方式。
  1. (*"$PWD"*)
  • 在這裡,shell 擴展也不受$IFS文件名生成的影響——未加引號的擴展既不會拆分也不會 glob。
  • 但是這裡未引用的擴展可能被解釋為模式而不是文字字元串,因此擴展可能意味著不止一件事,具體取決於它是否被引用。
  • 引用模式中使用的任何應該按字面解釋的變數很重要,就像引用要按字面解釋的模式字元一樣。
  • 例如,如果$PWD包含 a*並且沒有被引用,它將被解釋為模式對象而不是*要搜尋的文字。

引用自:https://unix.stackexchange.com/questions/192887