shell从入门到放弃(中)
来源:互联网 发布:吴公仪陈克夫 知乎 编辑:程序博客网 时间:2024/06/10 17:55
此文承接 shell从入门到放弃(上)
更加深入 ======下篇======
由此,继续从小白到放弃的第二部分@_@
Shell支持很多运算符,包括:Shell算数运算符、关系运算符、布尔运算符、字符串运算符等
算术运算
算术运算符:
+,-
*, /
%:取余
**:次方
算术运算格式:
(1) let VAR=算术表达式
(2) VAR=$[算术表达式]
(3) VAR=$((算术表达式))
(4) VAR=$(expr $ARG1 $OP $ARG2)
例如,两个数相加:
#!/bin/bashval=`expr 2 + 2` #或者 var=$(expr 2 + 2 )echo "Total value : $val"
运行脚本输出:
Total value : 4
两点注意:
表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数编程语言不一样。
完整的表达式要被 ` ` 包含,注意这个字符不是常用的单引号,在 Esc 键下边。表示命令替换,或者使用$()
#!/bin/sha=10b=20val=`expr $a + $b`echo "a + b : $val"val=`expr $a - $b`echo "a - b : $val"val=`expr $a \* $b`echo "a * b : $val"val=`expr $b / $a`echo "b / a : $val"val=`expr $b % $a`echo "b % a : $val"if [ $a == $b ]then echo "a is equal to b"fiif [ $a != $b ]then echo "a is not equal to b"fi运行结果:a + b : 30a - b : -10a * b : 200b / a : 2b % a : 0a is not equal to b
注意:
乘号(*)前边必须加反斜杠转义(\)才能实现乘法运算;
关系运算符
关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
#!/bin/sha=10b=20if [ $a -eq $b ]thenecho "$a -eq $b : a is equal to b"elseecho "$a -eq $b: a is not equal to b"fi运行结果为10 -eq 20: a is not equal to b
布尔运算符
例子
#!/bin/sha=10b=20if [ $a -lt 100 -a $b -gt 15 ]then echo "$a -lt 100 -a $b -gt 15 : returns true"else echo "$a -lt 100 -a $b -gt 15 : returns false"fi运行结果为10 -lt 100 -a 20 -gt 15 : returns true
字符串运算符
#!/bin/sha="abc"b="efg"if [ $a = $b ]then echo "$a = $b : a is equal to b"else echo "$a = $b: a is not equal to b"fi运行结果abc = efg: a is not equal to b
文件测试运算符
文件测试运算符用于检测 Unix 文件的各种属性。
这个很简单,不举例子了。
字符串是shell编程中最常用最有用的数据类型(除了数字和字符串,也没啥其它类型好用了),字符串可以用单引号,也可以用双引号,也可以不用引号。单双引号的区别跟PHP类似。
单引号
str='this is a string'
单引号字符串的限制:
单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
单引号字串中不能出现单引号(对单引号使用转义符后也不行)。
双引号
your_name='qinjx'str="Hello, I know your are \"$your_name\"! \n"
双引号的优点:
双引号里可以有变量
双引号里可以出现转义字符
拼接字符串
your_name="qinjx"greeting="hello, "$your_name" !"greeting_1="hello, ${your_name} !"echo $greeting $greeting_1
获取字符串长度
string="abcd"echo ${#string} #输出 4
提取子字符串
string="alibaba is a great company"echo ${string:1:4} #输出liba
查找子字符串
string="alibaba is a great company"echo `expr index "$string" is`
定义数组
在Shell中,用括号来表示数组,数组元素用“空格”符号分割开。定义数组的一般形式为:
array_name=(value1 ... valuen)
例如:
array_name=(value0 value1 value2 value3)
或者
array_name=(value0value1value2value3)
还可以单独定义数组的各个分量:
array_name[0]=value0array_name[1]=value1array_name[2]=value2
可以不使用连续的下标,而且下标的范围没有限制。
读取数组
读取数组元素值的一般格式是:
${array_name[index]}
例如:
valuen=${array_name[2]}
举个例子:
#!/bin/shNAME[0]="Zara"NAME[1]="Qadir"NAME[2]="Mahnaz"NAME[3]="Ayan"NAME[4]="Daisy"echo "First Index: ${NAME[0]}"echo "Second Index: ${NAME[1]}"
运行脚本,输出:
$./test.shFirst Index: ZaraSecond Index: Qadir
使用@ 或 * 可以获取数组中的所有元素,例如:
${array_name[*]}${array_name[@]}
举个例子:
#!/bin/shNAME[0]="Zara"NAME[1]="Qadir"NAME[2]="Mahnaz"NAME[3]="Ayan"NAME[4]="Daisy"echo "First Method: ${NAME[*]}"echo "Second Method: ${NAME[@]}"
运行脚本,输出:
$./test.shFirst Method: Zara Qadir Mahnaz Ayan DaisySecond Method: Zara Qadir Mahnaz Ayan Daisy
获取数组的长度
获取数组长度的方法与获取字符串长度的方法相同,例如:
# 取得数组元素的个数length=${#array_name[@]}# 或者length=${#array_name[*]}# 取得数组单个元素的长度lengthn=${#array_name[n]}
四、if-else了不起的条件判断
if 语句通过关系运算符判断表达式的真假来决定执行哪个分支。Shell 有三种 if ... else 语句:
if ... fi 语句;
if ... else ... fi 语句;
if ... elif ... else ... fi 语句。
1) if ... else 语句
if ... else 语句的语法:
if [ expression ]then Statement(s) to be executed if expression is truefi
如果 expression 返回 true,then 后边的语句将会被执行;如果返回 false,不会执行任何语句。
最后必须以 fi 来结尾闭合 if,fi 就是 if 倒过来拼写,后面也会遇见。
注意:expression 和方括号([ ])之间必须有空格,否则会有语法错误。
举个例子:
#!/bin/sha=10b=20if [ $a == $b ]thenecho "a is equal to b"fiif [ $a != $b ]thenecho "a is not equal to b"fi
运行结果:
a is not equal to b
2) if ... else ... fi 语句
if ... else ... fi 语句的语法:
if [ expression ]then Statement(s) to be executed if expression is trueelse Statement(s) to be executed if expression is not truefi
如果 expression 返回 true,那么 then 后边的语句将会被执行;否则,执行 else 后边的语句。
举个例子:
#!/bin/sha=10b=20if [ $a == $b ]thenecho "a is equal to b"elseecho "a is not equal to b"fi
执行结果:
a is not equal to b
3) if ... elif ... fi 语句
if ... elif ... fi 语句可以对多个条件进行判断,语法为:
if [ expression 1 ]then Statement(s) to be executed if expression 1 is trueelif [ expression 2 ]then Statement(s) to be executed if expression 2 is trueelif [ expression 3 ]then Statement(s) to be executed if expression 3 is trueelse Statement(s) to be executed if no expression is truefi
哪一个 expression 的值为 true,就执行哪个 expression 后面的语句;如果都为 false,那么不执行任何语句。
举个例子:
#!/bin/sha=10b=20if [ $a == $b ]thenecho "a is equal to b"elif [ $a -gt $b ]thenecho "a is greater than b"elif [ $a -lt $b ]thenecho "a is less than b"elseecho "None of the condition met"fi
运行结果:
a is less than b
if ... else 语句也可以写成一行,以命令的方式来运行,像这样:
if test $[2*3] -eq $[1+5]; then echo 'The two numbers are equal!'; fi;
if ... else 语句也经常与 test 命令结合使用,如下所示:
num1=$[2*3]num2=$[1+5]if test $[num1] -eq $[num2]thenecho 'The two numbers are equal!'elseecho 'The two numbers are not equal!'fi
输出:
The two numbers are equal!
test 命令用于检查某个条件是否成立,与方括号([ ])类似。
五、case-esac多分支选择
case ... esac 与其他语言中的 switch ... case 语句类似,是一种多分支选择结构。
case 语句匹配一个值或一个模式,如果匹配成功,执行相匹配的命令。case语句格式如下:
case 值 in模式1) command1 command2 command3 ;;模式2) command1 command2 command3 ;;*) command1 command2 command3 ;;esac
case工作方式如上所示。取值后面必须为关键字 in,每一模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;。;; 与其他语言中的 break 类似,意思是跳到整个 case 语句的最后。
取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。
下面的脚本提示输入1到4,与每一种模式进行匹配:
echo 'Input a number between 1 to 4'echo 'Your number is:\c'read aNumcase $aNum in1) echo 'You select 1';;2) echo 'You select 2';;3) echo 'You select 3';;4) echo 'You select 4';;*) echo 'You do not select a number between 1 to 4';;esac
输入不同的内容,会有不同的结果,例如:
Input a number between 1 to 4Your number is:3You select 3
再举一个例子:
#!/bin/bashoption="${1}"case ${option} in-f) FILE="${2}"echo "File name is $FILE";;-d) DIR="${2}"echo "Dir name is $DIR";;*)echo "`basename ${0}`:usage: [-f file] | [-d directory]"exit 1 # Command to come out of the program with status 1;;esac
运行结果:
$./test.shtest.sh: usage: [ -f filename ] | [ -d directory ]$ ./test.sh -f index.htm$ vi test.sh$ ./test.sh -f index.htmFile name is index.htm$ ./test.sh -d unixDir name is unix$
本文出自 “我的学习笔记” 博客,请务必保留此出处http://zhaoyongtao.blog.51cto.com/10955972/1770847
- shell从入门到放弃(中)
- shell从入门到放弃(上)
- shell从入门到放弃(下)
- Freemarker 从入门到放弃
- kmp从入门到放弃
- Dagger2从入门到放弃
- 推送 从入门到放弃
- 推送 从入门到放弃
- Python从入门到放弃
- vim从入门到放弃
- JAVA 从入门到放弃?
- markdown从入门到放弃
- Mycat从入门到放弃
- C++从入门到放弃
- Volatile从入门到放弃
- Eslint 从入门到放弃
- c++ 从入门到放弃
- git从入门到放弃
- Linux之iptables详解
- 是什么浪费了我的时间
- 使用https访问apache服务
- shell从入门到放弃(上)
- sublime XcodeDefault.xctoolchain/usr/bin/ctags: illegal option -- R usage: ctags [-BFadtuwvx] ...
- shell从入门到放弃(中)
- Linux系统启动流程及grub简单应用
- ftp服务器之vsftp
- Linux crontab定时执行任务
- keepalived-lvs-nat-主备模型实现高可用负载均衡
- shell从入门到放弃(下)
- MVC、MVP、MVVM解析
- keepalived-lvs-dr-主主模型实现高可用负载均衡
- zabbix监控介绍、基本安装配置