运算符相关话题

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


唯有爱与技术不可辜负

上一篇 下一篇

猜你喜欢

热点阅读