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