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