冒号在变量扩展中的用途

冒号在变量扩展中的用途

我正在审查一个旧的 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,则执行后面的命令并使用返回值。

相关内容