shell知识点
1.shell入门
2.基本语法
3.shell命令
4.流程控制
5.shell函数
6.输入输出重定向
7.文件包含
=====================================================================
一、shell入门
1.第一个shell程序
#!/bin/bash
echo "Hello world!"
文件名:first.sh
注意:如果在Windows环境下编辑了一个.sh的shell脚本,发现直接在linux下运行出现这个错误:gec@ubuntu16:/mnt/hgfs/share/13.shell$ ./test.sh
bash: ./test.sh: /bin/bash^M: bad interpreter: No such file or directory
是由于在Windows环境下编辑的代码格式为dos,需要修改为unix。
解决方式:
vi进入文件,直接 :set ff,可以查看文件格式,如果是dos,需要修改为unix
修改 :set ff = unix,保存退出
2.shell简介
①主要用途:用来开发一些自动化的小工具
②shell是一种脚本语言
③编译型语言:C/C++、Java、C#、Go:先编译,后执行
解释型语言:PHP、HTML、SHELL、python:边执行边解释
④脚本语言:使用灵活、部署容易、跨平台性好,适合用于web开发和小工具开发
⑤查看shell解释器:cat /etc/shells
查看默认shell:echo $SHELL
shell是一个程序环境,一般都放在/bin,当前linux系统可用的shell记录在 /etc/shells
3.执行shell脚本
①作为可执行程序运行: ./first.sh
②作为解释器参数运行: /bin/bash ./first.sh
二、基本语法
1.shell变量
在shell中,每一个变量的值都看做一个字符串,以字符串的形式存储
0.定义变量:
variable=value
注意:variable表示变量名,value表示变量值,中间=与前后不加空格
shell变量名的命名规则:
·变量名由数字、字母、下划线组成
·必须以字母或者下划线开头
·不能使用shell里面的关键字
①显示
echo $变量名
echo ${变量名}
echo "I am ${name}aaa."
*这里推荐都写上{}
②变量赋值:
变量定义: zhangsan=lisi
变量赋值: zhangsan=wangwu
将一个变量赋值给另外一个变量:name=$zhangsan
将一个变量赋值给另外一个变量:name=${zhangsan}
将一个命令的结果赋值给一个变量:zhangsan=$(ls -l)
将一个命令的结果赋值给一个变量:zhangsan=`ls -l`
③单引号和双引号的区别
如果是单引号:里面是什么内容就是什么内容,不会去解释,如果是双引号,输出的时候会先解析里面的变量和命令
单引比较适合定义显示纯字符串的情况,并且不希望解析变量和命令
#!/bin/bash
name=zhangsan
stringaaa='I am ${name}'
stringbbb="I am ${name}"
echo $stringaaa
echo $stringbbb
④建议:如果变量是数字,可以不加引号;如果是要原样输出,就加单引号;如果没有其他要求,一般字符串定义的时候就用双引号。
⑤删除变量 unset 变量名
⑥特殊变量
$n:表示第几个参数($0 :当前脚本文件名字,如果n>实际传参个数,直接就是n)
$#:表示的是传参个数
$*:表示所有的参数
$@:表示所有参数,被双引号包含时,与$*不同,否则一样
$?:函数返回值,上一条命令的退出状态
$$:表示当前脚本执行shell的进程号
使用:
#!/bin/bash
echo $0
echo $3
echo $#
echo $*
echo $@
echo $$
2.字符串
①单引号和双引号
②拼接字符串(类似C语言的sprintf)
name1="abcd"
name2="1234"
name=$name1$name2"asd"
③获取字符串长度
${#name1}
注意:#和变量名之间没有空格
④提取子串
${name:6:2}
name:字符串名称
6:从第六个位置开始截取
2:截取字符个数
⑤查找字符位置
`expr index $name 4`
查找字符‘4’在name字符串中的位置
查找子字符串在字符串中的位置
echo `expr index $name $name2`
------------------------------------
比如:找一个字符串“123456789”中8的位置,将此位置后面的字符保存到一个变量
name="123456789"//定义字符串变量
m=${#name}//获取字符串长度
n=`expr index $name 8`//找到字符串中某个字符的位置
name_n=${name:$n:$m}//截取字符串:从第n个字符取,取m个
name_new=$name_n"abcdefg"//拼接字符串
===================================================================
练习:在一个字符串A中,找一个字符,将字符前面的所有内容保存到另外一个变量B中,拼接一个字符串C,显示。
3.数组
①定义数组:
a=(1 2 3)
b=(ad asdgf qwer qwer)
b=(
ad
asdgf
qwer
qwer
)
②获取数组元素值
获取某一个元素:
${name[n]}
获取所有元素:
${name[*]}
${name[@]}
③获取数组元素个数:
${#name[@]}
${#name[*]}
④获取数组中某个元素所占字符数:
${#name[3]}
4.运算符
shell:算数运算符、关系运算符、布尔运算符、字符串运算符、*文件测试运算符
①数学运算:原生的bash不支持数学运算,shell的表达式计算工具:expr
算术运算符号:
+ 加法 `expr $a + $b`
- 减法 `expr $a - $b`
* 乘法 `expr $a \* $b`
/ 除法 `expr $a / $b`
% 求余 `expr $a % $b`
shell原生:
= 赋值运算符 a=$b
== 判断相等,相等返回true
!= 判断不等,不等返回true
②关系运算符
== 判断相等,相等返回true
!= 判断不等,不等返回true
-eq 判断两个数是否相等 相等返回true
-ne 判断不相等 不相等返回true
-gt 判断左边数大于右边数 是返回true
-lt 判断左边数小
-ge 判断左边数是否大于等于右边数
-le 判断左边小于等于右边
③布尔运算符(逻辑运算符)
-a 与运算 [ $a -eq 10 -a $b -ne 20 ]
-o 或运算 [ $a -gt 10 -o $b -lt 20 ]
! 非运算 [ ! false ]
5.字符串运算符
= 判断相等
!= 判断不等
-z 判断字符串长度为0
-n 判断字符串长度不为0
[$str] 判断字符串不为空
注意:
·在数字关系中,==表示是否相等,=表示赋值
·在表达式关系中,==表示判断相等,=表示赋值
·在字符串关系中,==表示字符串相等,=可以判断相等[ $a = $b]
6.文件测试运算符
判断文件类型:
-b:块设备文件
-c:字符设备文件
-d:目录我呢间
-f:普通文件
-p:管道文件
判断文件操作权限:
-r:可读文件
-w:可写文件
-x:可执行
判断文件是否不为空:
-s
判断目录是否存在:
-e
写法:
[ 运算符 文件名 ]
判断返回值
三、shell命令
1.常用命令在shell脚本
注意:在shell脚本里面,如果有运行程序的语句,不要写直接该脚本本身,否则会进入一个死循环。如果要执行本身,就做一定的处理。
2.test测试命令
①数值测试
②字符串测试
③文件测试
例子:
#!/bin/bash
num1=100
num2=100
if test $[num1] -eq $[num2]
then
echo "num1 = num2"
fi
str1="aaa"
str2="bbbb"
if test str1 = str2
then
echo "str1!=str2"
fi
file="./1.txt"
n=$(cat 1.txt)
if test -s $file
then
echo "file : ${n}"
fi
四、流程控制
1.if else
if 判断语句
then
......判断成功的执行代码......
else
......判断失败的执行代码......
fi
2.if elif ...elif...
if 判断语句1
then
......判断1成功的执行代码......
elif 判断语句2
then
......判断2成功的执行代码......
...
fi
3.case ... esca(类似C的switch case)
#!/bin/bash
num=3
case $num in
1)echo "num is \"1\""
;;
2)echo "num is \"2\""
;;
3)echo "num is \"3\""
;;
esac
4.for
5.while
6.until