发布时间:2020/12/04 作者:天马行空 阅读(1449)
shell基础语法
#!/bin/bash echo "Hello, world!"
上面中的 #! 是一种约定标记, 它可以告诉系统这个脚本需要什么样的解释器来执行;
变量
#变量赋值 bianliang="aaa" #删除变量 unset bianliang #输出变量 echo ${bianliang} #如果变量存在则返回word echo ${bianliang:+word} #变量不存在返回word,但不改变bianliang的值 echo ${bianliang:-word} #变量不存在返回word,并给bianliang赋值 echo ${bianliang:=word} #echo $bianliang
参数
#输出当前脚本的文件名 echo $0 #输出脚本传递的第一个参数 echo $1 #输出脚本传递参数的个数 echo $# #脚本传递的所有参数 echo $* echo $@ #当前脚本的进程ID echo $$
上一条命令返回的退出状态,执行成功返回0,失败返回1
echo $?
获得一个命令执行后的返回值
#它的意思就是说我们把一个命令的输出赋值给一个变量,方法为把命令用反引号(在Esc下方)引起来 directory=`ls` echo $directory
Shell运算符
条件测试语句可以分为 4 种:
1、文件测试语句;
2、逻辑测试语句;
3、整数值比较语句;
4、字符串比较语句。
文件测试运算符
-d | 测试文件是否为目录类型 目录返回0 |
-e | 测试文件是否存在 |
-f | 判断是否为一般文件 |
-r | 测试当前用户是否有权限读取 |
-w | 测试当前用户是否有权限写入 |
-x | 测试当前用户是否有权限执行 |
逻辑运算符
&& | “与”,都满足 |
|| | “或”,其中一个满足 |
! | “非”,取相反值判断 |
整数比较运算符
-eq | 是否等于 |
-ne | 是否不等于 |
-gt | 是否大于 |
-lt | 是否小于 |
-le | 是否等于或小于 |
-ge | 是否大于或等于 |
字符串比较运算符
= | 比较字符串内容是否相同 |
!= | 比较字符串内容是否不同 |
-z | 判断字符串内容是否为空 |
#注意运算符两边一定要要空格,不然就是在拼接字符串,不会执行运算 a=2 b=9 #加 echo `expr $a + $b` echo $[$a+$b] #减 echo `expr $a - $b` echo $[$a-b] #乘 echo `expr $a \* $b` echo $[$a*$b] #关系运算符 [ $a -eq $b ] #相等 [ $a -ne $b ] #不相等 [ $a -gt $b ] #> [ $a -ge $b ] #>= [ $a -lt $b ] #< [ $a -le $b ] #<= #字符串运算符 [ $a = $b ] #相等 [ $a != $b ] #不相等 [ -z $a ] #字符串长度为0,返回true [ -n $a ] #长度不为0返回true [ $a ] 不为空返回true #文件测试运算符 file=/home/wwwroot/www/shellstudy.sh if [ -r $file ] then echo "文件可读" else echo "文件不可读" fi
字符串
#拼接字符串 a='abcde'; echo "aaaa${a}aaaaaa" #获取字符串长度 echo ${#a} #截取字符串 echo ${a:0:2} #查找字符串 echo `expr index $a cde`
数组
a=(1 2 3 4 5) a[0]=1 a[1]=2 a[2]=3 a[3]=4 #读取下标为2的值 echo ${a[2]} #读取数组的全部元素 echo ${a[*]} #获取数组的长度 length=${#a[*]} echo $length #获取数组全部下标 xb=${!a[*]} echo $xb
流程控制语句
#if语句,注意条件表达式两边应该都有一个空格 a=2 b=3 if [ $a -eq $b ] then echo "===" else echo "!=" fi if [ $a -eq $b ] then echo "相等" elif [ $a -gt $b ] then echo "$a>$b" elif [ $a -lt $b ] then echo "$a<$b" fi
#for循环 arr=(1 2 3 4) for i in ${arr[*]} do echo "${i}" done for((i=1;i<=5;i++));do echo "这是第 $i 次调用"; done; while int=1 while(( $int<=5 )) do echo $int let "int++" done echo '按下 <CTRL-D> 退出' echo -n '输入你最喜欢的网站名: ' while read FILM do echo "是的!$FILM 是一个好网站" done #until循环 a=0 until [ ! $a -lt 10 ] do echo $a a=`expr $a + 1` done
#case命令 a=1 read a case ${a} in 1) echo 'aaaaa' ;; 2) echo 'bbbbb' ;; 3) echo 'ccccc' ;; *) echo 'error' ;; esac
#死循环 break while true do read a case ${a} in 1|2|3|4) echo "你输入了${a}" ;; *) echo "你要输入1-4之间的数字" break ;; esac done #死循环 continue while true do read a case ${a} in 1|2|3|4) echo "你输入了${a}" ;; *) echo "你要输入1-4之间的数字" continue ;; esac done
shell函数
#定义 function testF(){ echo "hell world $1 $2" } #调用函数 testF a b #删除函数 unset .f testF
注意:
1、 调用函数只需要给出函数名,不需要加括号。
2、函数返回值,可以显式增加return语句;如果不加,会将最后一条命令运行结果作为返回值。
3、Shell 函数返回值只能是整数,一般用来表示函数执行成功与否,0表示成功,其他值表示失败。
4、函数的参数可以通过 $n 得到。
实例:获得当前系统中还可以使用的内存大小,单位M
[root@netljc ~]# mem=`free -m | grep 'Mem' | awk '{print $4}'` [root@netljc ~]# echo $mem
先使用 free -m 命令查看内存使用量情况(单位为 MB),然后通过 grep Mem:命令过滤出剩余内存量的行,再用 awk '{print $4}'命令只保留第四列,最后用 mem=`语句`的方式把语句内执行的结果赋值给变量