
我正在審查一個舊的 shell 腳本。我無法理解其中的兩件事。
rm /data/log || true
value=$(cat /datafile)
if [ ${value: -1} == 0 ]
then echo 'do'
else echo 'dont'
fi
value: -1
- 這實際上是在做什麼?rm /data/log || true
- 這是||true
在做什麼?
答案1
${value: -1}
擴展到最後一個字符變數內容。
${value:-1}
是不同的從${value: -1}
!
參考外殼參數擴展在手冊中:
${value:-1}
擴展為變數的內容value
,或者如果變數未設定或為空,則擴展為字串“1”${value: -1}
${var:offset:length}
是提取變數內容的子字串的形式的縮寫形式。偏移量-1
表示「距離字串末尾一個字元」。該:length
部分缺失,因此從offset
字串的 到 末尾取出子字串。手冊說:
請注意,負偏移量必須與冒號分隔至少一個空格,以避免與 ':-' 擴展混淆。
答案2
rm /data/log || true
僅(根據我的拙見)如果腳本使用set -e
.set -e
當指令以錯誤狀態退出時,使 shell 退出。該腳本的創建者顯然不知道 的-f
標誌rm
。
${value: -1}
可能是錯字。它應該是,如果為 null 或未設置,則為變數擴展${value:-1}
提供預設值(1,而不是 -1;這-
是語法的一部分)。:-
value
如果確實如此${value: -1}
,請參閱格倫傑克曼的回答以了解實際意義。
答案3
來自 bash(1):${parameter:-word} 使用預設值。如果參數未設定或為空,則取代單字的擴展。否則,將替換參數的值。
|| true
確保命令傳回 true。||
是一個短路或運算符,如果前面的命令返回 false,則執行後面的命令並使用返回值。