Bash

Grep 命令未返回預期的測試結果

  • February 22, 2021

在將條件附加到 profile.d 文件之前,我正在嘗試進行比較

Agrep -F 'TMOUT' /etc/profile.d/sh.local向我展示了我的期望,但測試始終顯示為真。在所有這些範例中,我已經將我想要的資訊附加到 sh.local 但如果它存在我不想再做一次。

[ ! `grep -Fq 'TMOUT' /etc/profile.d/sh.local` ] && echo $?
0
[ ! `grep -Fq 'NOT_PRESENT' /etc/profile.d/sh.local` ] && echo $?
0

儘管這是針對 .ebextension 命令的,但在我嘗試部署之前測試就失敗了,但我想最終結果應該是這樣的,但我顯然有些錯誤。我試過使用 $(grep) vs grep。還有 ==1 對 !

 01_hard_5.4.5_shell_timeout:
   test: "[ $(grep -Fxq 'TMOUT' /etc/profile.d/sh.local) ==1 ]"
   command: |
     printf '\nTMOUT=300\nreadonly TMOUT\nexport TMOUT\n' | sudo tee -a /etc/profile.d/sh.local >/dev/null

作為記錄,這是 Amazon Linux 2,以下命令會輸出以下內容

grep -F 'TMOUT' /etc/profile.d/sh.local
TMOUT=300
readonly TMOUT
export TMOUT

grep -F 'NOT_PRESENT' /etc/profile.d/sh.local

[ ! `grep -Fq 'TMOUT' /etc/profile.d/sh.local` ] && echo $?
0
[ ! `grep -Fq 'NOT_PRESENT' /etc/profile.d/sh.local` ] && echo $?
0

grep 命令周圍的反引號構成命令替換,返回命令的標準輸出。由於您使用-q,標準輸出始終為空,因此無論您使用什麼字元串,您的[ ! ... ]測試都變為

[ ! ]

這是測試構造的“一個參數形式”,並測試單字元字元串的非空性!- 這始終是正確的。

要測試 grep 命令的退出狀態,您可以使用:

grep -Fq 'TMOUT' /etc/profile.d/sh.local && echo $?

也可以看看


同樣地,

[ $(grep -Fxq 'TMOUT' /etc/profile.d/sh.local) ==1 ]

變成

[ ==1 ]

測試 string 的非空性==1;您可能打算寫== 1至少會出錯的消息[: ==: unary operator expected- 請參閱

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