冒號在變數擴充中的用途

冒號在變數擴充中的用途

我正在審查一個舊的 shell 腳本。我無法理解其中的兩件事。

rm /data/log || true

value=$(cat /datafile)
if [ ${value: -1} ==  0 ] 
 then echo 'do'
else echo 'dont'
 fi
  1. value: -1- 這實際上是在做什麼?
  2. rm /data/log || true- 這是||true在做什麼?

答案1

${value: -1}擴展到最後一個字符變數內容。

${value:-1}不同的${value: -1}

參考外殼參數擴展在手冊中:

  1. ${value:-1}擴展為變數的內容value,或者如果變數未設定或為空,則擴展為字串“1”

  2. ${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,則執行後面的命令並使用返回值。

相關內容