Shell Operator
shell 和其他编程语言一样,具有多种操作符(赋值操作符、算术运算符、逻辑操作符、关系运算符、位运算符、条件操作符、逗号运算符)。这些操作符可以组成复杂的运算表达式。
赋值操作符
示例 1
test.sh 文件的内容如下
string=hello
string+=" world"
echo $string
在命令提示符下输入 ./test.sh,执行结果如下:
hello world
算术操作符
注释 1:shell 的自加、自减操作符在使用上和 c 语言一样。-- 或者 ++ 出现在变量前面是前缀形式,先运算后赋值;-- 或者 ++ 出现在变量后面是后缀形式,先赋值后运算。
shell 中的整型变量是 32 位有符号数,范围为 -2^31 ~ 2^32 -1。如果算术运算的结果超过这个范围将溢出。
示例 2
test.sh 文件的内容如下
let x=2
let y=3
let z=6
let m=$(((x**y+z)/2-1))*x%5
let z*=3
let n=x++
let k=++y
((x++))
((y++))
echo x=$x
echo y=$y
echo z=$z
echo m=$m
echo n=$n
echo k=$k
在命令提示符下输入 ./test.sh,执行结果如下:
x=4
y=5
z=18
m=2
n=2
k=4
在数字常量表达式中,使用 base#number 可以将一个数字从任何进制转换成十进制。
示例 3
test.sh 文件的内容如下
echo binary=$((2#110))
echo ternary=$((3#110))
echo octal=$((8#110))
echo decimal=$((10#110))
echo hexdecimal=$((16#110))
在命令提示符下输入 ./test.sh,执行结果如下:
binary=6
ternary=12
octal=72
decimal=110
hexdecimal=272
逻辑操作符
1 expression1 && expression2,只有两个表达式的运算结果都为非 0 值,逻辑与运算的结果才为 1;否则为 0。
2 expression1 || expression2,只有两个表达式的运算结果都为 0 值,逻辑或运算的结果才为 0;否则为 1。
3 !expression,表达式为非 0 值,则逻辑非运算的结果为 0;否则为 1。
4 逻辑运算的结果只能是 1(true)或者 0(false)。
5 逻辑运算可以用于算术运算和字符串运算上下文。
示例 4
test.sh 文件的内容如下
echo 1\&\&2=$((1&&2))
echo 1\|\|0=$((1||0))
echo 2\&\&0=$((2&&0))
echo \!0=$((!0))
echo \!2=$((!2))
在命令提示符下输入 ./test.sh,执行结果如下:
1&&2=1
1||0=1
2&&0=0
!0=1
!2=0
示例 5
test.sh 文件的内容如下
x=2
y=3
if [ "$x" = 2 ] && [ "$y" = 3 ]
then
echo x=$x and y=$y
else
echo x\!=$x or y\!=$y
fi
在命令提示符下输入 ./test.sh,执行结果如下:
x=2 and y=3
关系运算符
注释 1:进行数值比较时需要使用双括号进行算术扩展 ((expression1 OP expression2))。
1 进行数值比较时,可以使用 [ expression1 OP expression2 ],OP 可以为 -gt、-lt、-ge、-le、-eq、-ne。也可以使用 ((expression1 OP expression2)),OP 可以为 >、<、>=、<=、==、!=。这几个关系运算符都是测试整数表达式 expression1 和 expression2 之间的大小关系。
2 >、<、==、!= 也可以进行字符串比较。
3 进行字符串比较时,== 可以使用 = 替代。
4 == 和 != 进行字符串比较时,可以使用 [ string1 OP string2 ] 或者 [[ string1 OP string2 ]] 的形式。
5 > 和 < 进行字符串比较时,需要使用 [[ string1 OP string2 ]] 或者 [ string1 \OP string2 ]。也就是使用 [] 时,> 和 < 需要使用反斜线转义。
示例 6
test.sh 文件的内容如下
let x=2**5
let y=3**2
if [ $x -ge $y ]
then
echo max=$x
else
echo max=$y
fi
if (($x == $y))
then
echo $x equal $y
else
echo $x not equal $y
fi
在命令提示符下输入 ./test.sh,执行结果如下:
max=32
32 not equal 9
示例 7
test.sh 文件的内容如下
string1=abc
string2=abd
if [ $string1 \> $string2 ]
then
echo $string1 is greater $string2 with ASCII
else
echo $string1 is not greater $string2 with ASCII
fi
if [[ $string1 > $string2 ]]
then
echo $string1 is greater $string2 with ASCII
else
echo $string1 is not greater $string2 with ASCII
fi
if [ $string1 == $string2 ]
then
echo $string1 is equal $string2 with ASCII
else
echo $string1 is not equal $string2 with ASCII
fi
if [[ $string1 = $string2 ]]
then
echo $string1 is equal $string2 with ASCII
else
echo $string1 is not equal $string2 with ASCII
fi
在命令提示符下输入 ./test.sh,执行结果如下:
abc is not greater abd with ASCII
abc is not greater abd with ASCII
abc is not equal abd with ASCII
abc is not equal abd with ASCII
位运算符
1 shell 的位操作符在使用上和 c 语言一样。位操作符在 shell script 中使用频率不是很高。
示例 8
test.sh 文件的内容如下
x=2
y=3
echo x\&y=$((x&y))
echo x\|y=$((x|y))
echo x\^y=$((x^y))
echo \~y=$((~y))
echo x\<\<y=$((x<<y))
echo x\>\>y=$((x>>1))
((x<<=2))
echo x=$x
在命令提示符下输入 ./test.sh,执行结果如下:
x&y=2
x|y=3
x^y=1
~y=-4
x<<y=16
x>>y=1
x=8
条件操作符
1 shell 的条件操作符在使用上和 c 语言一样。形式为 expression1 ? expression2 : expression3。如果表达式 expression1 为真,则条件表达式的值为表达式 expression2 的值;否则为 expression3 的值。
2 expression2 和 expression3 必须是整数算术表达式,不能是字符串。
示例 9
test.sh 文件的内容如下
let x=2**5
let y=3**2
if (($x >= $y))
then
let max=$x
else
let max=$y
fi
max1=$(($x>=$y?$x+$y:$x-$y))
echo max_number=$max
echo max_number=$max1
在命令提示符下输入 ./test.sh,执行结果如下:
max_number=32
max_number=41
逗号操作符
1 shell 的逗号操作符在使用上和 c 语言一样。多个算术运算都会被执行,但是只有最后一个算术运算的结果作为整个表达式的结果。
2 逗号操作符主要用于循环操作中。
示例 10
test.sh 文件的内容如下
x=2
y=3
z=$((x++, x+y--))
echo x=$x
echo y=$y
echo z=$z
在命令提示符下输入 ./test.sh,执行结果如下:
x=3
y=2
z=6
shell 和其他编程语言一样,具有多种操作符(赋值操作符、算术运算符、逻辑操作符、关系运算符、位运算符、条件操作符、逗号运算符)。这些操作符可以组成复杂的运算表达式。
赋值操作符
| |
| |
| |
示例 1
test.sh 文件的内容如下
string=hello
string+=" world"
echo $string
在命令提示符下输入 ./test.sh,执行结果如下:
hello world
算术操作符
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
注释 1:shell 的自加、自减操作符在使用上和 c 语言一样。-- 或者 ++ 出现在变量前面是前缀形式,先运算后赋值;-- 或者 ++ 出现在变量后面是后缀形式,先赋值后运算。
shell 中的整型变量是 32 位有符号数,范围为 -2^31 ~ 2^32 -1。如果算术运算的结果超过这个范围将溢出。
示例 2
test.sh 文件的内容如下
let x=2
let y=3
let z=6
let m=$(((x**y+z)/2-1))*x%5
let z*=3
let n=x++
let k=++y
((x++))
((y++))
echo x=$x
echo y=$y
echo z=$z
echo m=$m
echo n=$n
echo k=$k
在命令提示符下输入 ./test.sh,执行结果如下:
x=4
y=5
z=18
m=2
n=2
k=4
在数字常量表达式中,使用 base#number 可以将一个数字从任何进制转换成十进制。
示例 3
test.sh 文件的内容如下
echo binary=$((2#110))
echo ternary=$((3#110))
echo octal=$((8#110))
echo decimal=$((10#110))
echo hexdecimal=$((16#110))
在命令提示符下输入 ./test.sh,执行结果如下:
binary=6
ternary=12
octal=72
decimal=110
hexdecimal=272
逻辑操作符
| |
| |
| |
| |
1 expression1 && expression2,只有两个表达式的运算结果都为非 0 值,逻辑与运算的结果才为 1;否则为 0。
2 expression1 || expression2,只有两个表达式的运算结果都为 0 值,逻辑或运算的结果才为 0;否则为 1。
3 !expression,表达式为非 0 值,则逻辑非运算的结果为 0;否则为 1。
4 逻辑运算的结果只能是 1(true)或者 0(false)。
5 逻辑运算可以用于算术运算和字符串运算上下文。
示例 4
test.sh 文件的内容如下
echo 1\&\&2=$((1&&2))
echo 1\|\|0=$((1||0))
echo 2\&\&0=$((2&&0))
echo \!0=$((!0))
echo \!2=$((!2))
在命令提示符下输入 ./test.sh,执行结果如下:
1&&2=1
1||0=1
2&&0=0
!0=1
!2=0
示例 5
test.sh 文件的内容如下
x=2
y=3
if [ "$x" = 2 ] && [ "$y" = 3 ]
then
else
echo x\!=$x or y\!=$y
fi
在命令提示符下输入 ./test.sh,执行结果如下:
x=2 and y=3
关系运算符
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
注释 1:进行数值比较时需要使用双括号进行算术扩展 ((expression1 OP expression2))。
1 进行数值比较时,可以使用 [ expression1 OP expression2 ],OP 可以为 -gt、-lt、-ge、-le、-eq、-ne。也可以使用 ((expression1 OP expression2)),OP 可以为 >、<、>=、<=、==、!=。这几个关系运算符都是测试整数表达式 expression1 和 expression2 之间的大小关系。
2 >、<、==、!= 也可以进行字符串比较。
3 进行字符串比较时,== 可以使用 = 替代。
4 == 和 != 进行字符串比较时,可以使用 [ string1 OP string2 ] 或者 [[ string1 OP string2 ]] 的形式。
5 > 和 < 进行字符串比较时,需要使用 [[ string1 OP string2 ]] 或者 [ string1 \OP string2 ]。也就是使用 [] 时,> 和 < 需要使用反斜线转义。
示例 6
test.sh 文件的内容如下
let x=2**5
let y=3**2
if [ $x -ge $y ]
then
echo max=$x
else
echo max=$y
fi
if (($x == $y))
then
echo $x equal $y
else
echo $x not equal $y
fi
在命令提示符下输入 ./test.sh,执行结果如下:
max=32
32 not equal 9
示例 7
test.sh 文件的内容如下
string1=abc
string2=abd
if [ $string1 \> $string2 ]
then
echo $string1 is greater $string2 with ASCII
else
echo $string1 is not greater $string2 with ASCII
fi
if [[ $string1 > $string2 ]]
then
echo $string1 is greater $string2 with ASCII
else
echo $string1 is not greater $string2 with ASCII
fi
if [ $string1 == $string2 ]
then
echo $string1 is equal $string2 with ASCII
else
echo $string1 is not equal $string2 with ASCII
fi
if [[ $string1 = $string2 ]]
then
echo $string1 is equal $string2 with ASCII
else
echo $string1 is not equal $string2 with ASCII
fi
在命令提示符下输入 ./test.sh,执行结果如下:
abc is not greater abd with ASCII
abc is not greater abd with ASCII
abc is not equal abd with ASCII
abc is not equal abd with ASCII
位运算符
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
1 shell 的位操作符在使用上和 c 语言一样。位操作符在 shell script 中使用频率不是很高。
示例 8
test.sh 文件的内容如下
x=2
y=3
echo x\&y=$((x&y))
echo x\|y=$((x|y))
echo x\^y=$((x^y))
echo \~y=$((~y))
echo x\<\<y=$((x<<y))
echo x\>\>y=$((x>>1))
((x<<=2))
echo x=$x
在命令提示符下输入 ./test.sh,执行结果如下:
x&y=2
x|y=3
x^y=1
~y=-4
x<<y=16
x>>y=1
x=8
条件操作符
| |
| |
1 shell 的条件操作符在使用上和 c 语言一样。形式为 expression1 ? expression2 : expression3。如果表达式 expression1 为真,则条件表达式的值为表达式 expression2 的值;否则为 expression3 的值。
2 expression2 和 expression3 必须是整数算术表达式,不能是字符串。
示例 9
test.sh 文件的内容如下
let x=2**5
let y=3**2
if (($x >= $y))
then
let max=$x
else
let max=$y
fi
max1=$(($x>=$y?$x+$y:$x-$y))
echo max_number=$max
echo max_number=$max1
在命令提示符下输入 ./test.sh,执行结果如下:
max_number=32
max_number=41
逗号操作符
| |
| |
1 shell 的逗号操作符在使用上和 c 语言一样。多个算术运算都会被执行,但是只有最后一个算术运算的结果作为整个表达式的结果。
2 逗号操作符主要用于循环操作中。
示例 10
test.sh 文件的内容如下
x=2
y=3
z=$((x++, x+y--))
echo x=$x
echo y=$y
echo z=$z
在命令提示符下输入 ./test.sh,执行结果如下:
x=3
y=2
z=6