Shell-Script

如果怎麼辦“@$1@”=“@@”_’@$1@“=”@@’’@$1@’ = ‘@@’;在bash中是什麼意思?

  • August 12, 2022

所以,我是腳本新手,我正試圖弄清楚這是做什麼的。你能幫我嗎?

if [ "@$1@" = "@@" ]; then
strDate ='date +%Y%m%d' 
else
strDate=$1
fi

整體結構是if {condition} then {do something} else {do something different}。不過,shell 本身需要更多語法來幫助它解析構造,例如fi表示構造結束的結束,並[ ... ]執行條件測試。)

  • 條件測試[ "@$1@" = "@@" ]比較兩個字元串是否相等 ( [ X = Y ]):

    • 第一個字元串@後面是程序或函式的第一個參數 ( $1),然後是另一個@。因此,如果您red作為第一個參數傳遞,那麼字元串將為@red@. 另一方面,如果你什麼都沒有傳遞,那麼字元串就是@@
    • 第二個字元串是文字@@這裡發生的是條件測試正在檢查$1(程序或函式的第一個參數)是否為空。最好寫成[ -z "$1" ].
  • 下一行strDate ='date +%Y%m%d' 語法錯誤,無法執行。也許你的意思是strDate=date +%Y%m%d`` ,這些天最好寫成strDate=$(date +%Y%m%d)。(在任何一種情況下,變數名、 和它的賦值值之間都不能有空格=。你顯示的單引號 ( '...') 意味著賦值將是字元串中的文字 12 個字元date +%Y%m%d,但意圖是顯然要使用反引號來分配執行該命令的輸出。)此行會將變數分配給$strDate格式為今天的日期YYYYMMDD(例如 2022 年 8 月 12 日將是20220812)。

  • 最後的賦值將作為第一個參數提供給程序或函式的值分配strDate=$1給變數。$strDate您提供的程式碼中的值沒有進一步驗證。

我應該指出,您可以通過傳遞程式碼來辨識許多語法並構造錯誤shellcheck(也在https://shellcheck.net/)。

這是更正後的程式碼,帶有縮進以提高可讀性:

if [ -z "$1" ]
then
   strDate=$(date +'%Y%m%d')
else
   strDate=$1
fi

您將看到 shell 的語法清楚地實現了我在第一段中給出的描述。有些人喜歡將 與then放在同一行if,即if [ -z "$1" ]; then,就像您在原始程式碼中所做的那樣;只要您保持一致,這兩種方式都無關緊要。但是,幾乎所有有經驗的編碼人員都使用縮進來顯示程式碼結構,這將是一種非常值得在您自己的程式碼中使用的方法,因為它有助於減少整個類的錯誤。

最後,整個塊可以用更慣用的方式替換為單個條件賦值:

strDate=${1:-$(date +'%Y%m%d')}

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