运算符相关话题
2017-10-15 本文已影响9人
rochestor
运算符
赋值运算符
=
# "=" 即可以用作赋值,也可以用作测试
# "="左右不允许有空格
var=27
category=minerals
# = 作为测试操作符
if [ "$string1" = "$string2" ]
then
command
fi
# [ "X$string1" = "X$string2" ] 这样写是安全的,
# 这样写可以避免任意一个变量为空时的报错。
# (变量前加的"X"字符规避了变量为空的情况)
算术运算符
** 幂运算
let a=5**3
echo $a # 125
+=
#自增常用的几种写法
a=1
let "a=$a+1"
(( a++ ))
(( a = $a + 1 ))
n=$[ $n + 1 ] # 整数扩展符。在 $[ ] 中可以计算整数的算术表达式
let "a++"
注意:注意,Bash并不支持浮点运算,Bash会将带小数点的数看做字符串
a=1.5
let "b = $a + 1.3" # 报错
# t2.sh: let: b = 1.5 + 1.3: syntax error in expression
# (error token is ".5 + 1.3")
# 如果你想在脚本中使用浮点数运算,借助bc 或外部数学函数库
位运算
位运算很少出现在shell脚本中
逻辑(布尔)运算符
! 非(NOT)
fi
&& 逻辑与(AND)
if [ $condition1 ] && [ $condition2 ]
# 等同于: if [ $condition1 -a $condition2 ]
# 返回true如果 condition1 和 condition2 同时为真...
if [[ $condition1 && $condition2 ]] # 可行
# 注意,&& 运算符不能用在[ ... ]结构里。
数字常量
shell脚本会把数字以十进制整数看待(base 10),除非数字加了特殊的前缀或标记。 带前缀0的数字是八进制数(base 8);带前缀0x的数字是十六进制数(base 16)。 内嵌 # 的数字会以 BASE#NUMBER 的方式进行求值(不能超出当前shell支持整数的范围)
# 十进制数: 默认
let "dec = 32"
echo "decimal number = $dec" # 32
# 一切正常。
# 八进制数: 带前导'0'的数
let "oct = 032"
echo "octal number = $oct" # 26
# 结果以 十进制 打印输出了。
# ------ ------ -----------
# 十六进制数: 带前导'0x'或'0X'的数
let "hex = 0x32"
echo "hexadecimal number = $hex" # 50
echo $((0x9abc)) # 39612
# ^^ ^^ 双圆括号进行表达式求值
# 结果以十进制打印输出。
# 其他进制数: BASE#NUMBER
# BASE 范围: 2 - 64
# NUMBER 必须以 BASE 规定的正确形式书写,如下:
let "bin = 2#111100111001101"
echo "binary number = $bin" # 31181
let "b32 = 32#77"
echo "base-32 number = $b32" # 231
let "b64 = 64#@_"
echo "base-64 number = $b64" # 4031
# 这种表示法只对进制范围(2 - 64)内的 ASCII 字符有效。
# 10 数字 + 26 小写字母 + 26 大写字母 + @ + _
双圆括号结构
(( a = 23 )) # C风格的变量赋值,注意"="等号前后都有空格
echo "a (initial value) = $a" # 23
(( a++ )) # 后缀自增'a',C-style.
echo "a (after a++) = $a" # 24
(( a-- )) # 后缀自减'a', C-style.
echo "a (after a--) = $a" # 23
(( ++a )) # 前缀自增'a', C-style.
echo "a (after ++a) = $a" # 24
(( --a )) # 前缀自减'a', C-style.
echo "a (after --a) = $a" # 23
########################################################
# 注意,C风格的++,--运算符,前缀形式与后缀形式有不同的
#+ 副作用。
n=1; let --n && echo "True" || echo "False" # False
n=1; let n-- && echo "True" || echo "False" # True
# 感谢 Jeroen Domburg。
########################################################
(( t = a<45?7:11 )) # C风格三目运算符。
# ^ ^ ^
echo "If a < 45, then t = 7, else t = 11." # a = 23
echo "t = $t " # t = 7
唯有爱与技术不可辜负