如果怎麼辦“@$1@”=“@@”_’@$1@“=”@@’’@$1@’ = ‘@@’;在bash中是什麼意思?
所以,我是腳本新手,我正試圖弄清楚這是做什麼的。你能幫我嗎?
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')}