shell概述
1、shell是一个用c语言编写的程序它是用户使用Linux的桥梁。
2、shell即是一个一种命令语言,又是一种程序设计语言。
3、shell是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务
Ken Thompson 的 sh 是第一种 unix shell 。
脚本和环境
shell脚本
shell脚本(shell script),是一种为shell编写的脚本程序。(其实就是一个文件,只不过这个文件可被执行)
shell环境
shell编程只要有一个能编写代码的文本编辑器vi和一个能解释执行的脚本解释器就可以了。/bin/bash
Linux的shell种类众多,常见有:
Bourne Again shell
1、由于易用和免费,bash在日常中广泛使用。
2、bash也是大多数Linux系统默认的shell。
shell脚本是做什么的?
将许多命令写在一起,让用户很轻松的就能执行一个文件的shell脚本,就能够一次执行多个命令。
shell构成
bash环境配置文件
.bash_profile
设置环境变量
账户——建立,该文件就存在
.bashrc
存放针对bash的命令
每次启动就执行它
在.bash_profile之后执行
.bash_logout
仅在退出注册时运行
.bash_history
历史记录
shell脚本编写
格式:vi filename.sh
例:写一个test.sh,输出“helloworld”
使用vi来编写shell脚本
脚本第一行格式:
#!/bin/bash
符号#!用来指定该脚本文件的解析程序,这里使用的是bin目录下的bash解析器。
当编辑好脚本后,如果要执行该脚本,还必须使其具有可执行属性。
脚本编写完成后,解析方式:
解析方式一
chmod +x 脚本文件的名字
./脚本文件的名字
解析方式二(重点掌握)
/bin/bash 脚本文件的名字
shell中的变量
在shell脚本中,变量有两种,一种是用户自定义变量,另一种是系统默认变量。
注意,变量名和等号之间不能有空格。
变量名的命名必须遵循如下规则:
首个字符必须为字母(a-z A-Z)
中间不能有空格,可以使用下划线(_)
不能使用标点符号
不能使用bash里的关键字(关键词)
关键字(关键词):指在当前操作中有特殊含义的一些词
1、变量的声明(创建):变量名+变量值
x=2
your_name="ljx"
变量声明完成后,如何使用每个变量里面存储的值?
2、变量的使用:$变量名
格式二:${变量名}
变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界
3、输出: echo $变量名
只读变量:只能读取,不能修改
格式:readonly 变量名
删除变量
使用unset命令可以删除变量。
语法: unset 变量名
变量被删除后不能再次使用。unset命令不能删除只读变量
字符串操作
字符串:一般是由多个字符构成,用双引号引起来“abc”
字符:一般是由单个字符构成,用单引号引起来‘a’
1、拼接字符串:将两个字符串拼接在一起
name=“ljx”
pj1="hello,"$name"!"
pj2="hello,${name}!"
echo $pj1 $pj2
2、获取字符串长度:看一个字符串由多少个字符构成
string="abcd"
echo ${#string}
注意:符号,空格也算作一个字符
3、提取子字符串
例:从字符串第2个字符开始截取4个字符:
string="asddfgghj"
echo ${string:1:4}
注意:字符串的截取工作是根据每个字符的下标来完成的,下标都是从0开始的
shell数组
数组:相当于多个相同类型的变量组成的集合,没有限定数组的大小
定义数组
格式:数组名=(值1 指 值3…)
读取数组
格式:${数组名[下标]}
例如:valuen=${array_name[n]}
使用@符号可以获取数组中的所有元素,例如
echo ${array_name[@]}
获取数组的长度
1、取得数组元素的个数
lengh=${array_name[@]}
2、取得数组单个元素的长度
lenghn=${#array_name[n]}
shell注释
以"#"开头的行就是注释,会被解释器忽略。
sh里没有多行注释,只能每一行加一个#号
shell基本运算符
算数运算符
假定变量a为10 ,变量b为20
运算符 说明 举例
+ 加法 `expr $a + $b` 结果为30
- 减法 `expr $a - $b` 结果为-10
* 乘法 `expr $a \* $b` 结果为200. 转义字符。
/ 除法 `expr $b / %=$a` 结果为2
% 取余 `expr $b % $a` 结果为0.
= 赋值 a=$b 将把变量b的值赋给a。
== 相等 用于比较两个数字,相同则返回true。[$a == $b]返回false.
!= 不相等 用于比较两个数字,不相同则返回true。[$a !=$b]返回true。
expr是一款表达式计算工具,使用它能完成表达式的求职操作。
使用格式:`expr 数值1 运算符号 数值2`
乘法* 在expr工具中,无法直接将*当做乘法看待
转义字符格式:\字符
两个数相加(注意使用的是反引号`而不是单引号'):
#!/bin/bash
val=`expr 2 + 2`
echo "sum:$val"
关系运算符
关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
假定变量a为10,变量b为20:
运算符 说明 举例
-eq 检测两个数是否相等,相等返回true。 [$a -eq $b] 返回false
-ne 检测两个数是否相等,不相等返回true。 [$a -ne $b]返回true
-gt 检测左边的数是否大于右边的,如果是则返回true。 [$a -gt $b]返回true。
-lt 检测左边的数是否小于右边的,如果是则返回true。 [$a -lt $b]返回true
-ge 检测左边的数是否大于等于右边的,如果是则返回true。
[$a -ge $b]返回false
-le 检测左边的数是否小于等于右边的,如果是则返回true。 [$a -le $b]返回true
布尔运算符
假定变量a为10,变量b为20:
运算符 说明 举例
! 非运算,表达式为true则返回false,否则返回true。 [!false]返回true
-o 或运算,有一个表达式为true则返回true。 [$a -it 20 -o $b -gt 100]返回true
-a 与运算,两个表达式都为true才返回true。 [$a -lt 20 -a $b -gt 100]返回false
逻辑运算符
假定变量a为10,变量b为20
运算符 说明 举例
&& 逻辑的AND [[$a -lt 100 && $b -gt 100]]返回false
|| 逻辑的OR [[$a -lt 100 || $b -gt 100]]返回true
字符串运算符
假定变量a为"abc",变量b为"efg":
运算符 说明 举例
= 检测两个字符串是否相等,相等返回true。 [$a = $b]返回false
!= 检测两个字符串是否相等,不相等返回true。 [$a != $b]返回true
-z 检测字符串长度是否为0,为0返回true。 [ -z $a ]返回false
-n 检测字符串长度是否为0,不为0返回true。 [ -n $a] 返回true
str 检测字符串是否为空(null),不为空返回true。 [$a]返回true
文件测试运算符
文件测试运算符用于检测文件的各种属性。
-d file 检测文件是否有目录,如果是,则返回true。 [-d $file ]返回false
-f file 检测文件是否是普通文件,如果是则返回true。 [-f $file ]返回true
-r file 检测文件是否可读,如果是则返回true。 [ -r $file ]返回true
-w file 检测文件是否可写,如果是则返回true. [ -w $file]返回true
-x file 检测文件是否可执行,如果是,则返回true。 [-x $file]返回true
-s file 检测文件是否为空(文件大小是否大于0),不为空返回true。 [-s $file]返回true
-e file 检测文件(包含目录)是否存在,如果是,则返回true。 [-e $file]返回true
shell echo命令
作用:用于字符串的输出
格式:echo "字符串内容"
1、显示转义字符
echo"\"It is a test\""
2、显示变量
read 命令 从标准输入中读取一行,并把输入行的每个字段的值指定给shell
变量
#!/bin/bash
read name
echo "$name It is a test"
3、显示换行
echo -e "OK!\n"# -e 开启转义
echo "It is a test"
4、显示不换行
#!/bin/sh
echo -e "OK!\c" # -e 开启转义\c 不换行
echo "It is a test"
5、显示结果定向至文件
echo "It is a test" > myfile
6、显示命令执行结果
echo`date`
注意:这里使用的反引号`,不是单引号’。
常见的转义字符
\b 后退(清除前一项数据)
\n 换行(相当于回车)
\t 水平制表符(Tab键)
\\ 反斜杠字符----->\( )
shell printf命令
输出
格式:printf 格式声明 与格式声明相对应的参数列表
格式声明由两部分组成:百分比符号(%)和指示符
%d %s %c %f 格式替代符:
d:date 数字 -- 对应位置参数必须是数字型
s:str 字符串 -- 对应位置参数必须是字符串
c:char 字符 -- 对应位置参数显示对应参数的第一个字符
f:float 浮点 -- 对应位置参数必须是数字型
printf "%-10s %-8s %-4s\n" name sex kg
printf "%-10s %-8s %-4.2f\n" qwer yiy 87.234
%-10s指一个宽度为10个字符(-表示左对齐,没有则表示右对齐),
任何字符都会显示在10个字符宽度的字符内,
如果不足则自动以空格填充,超过也会将内容全部显示出来。
%-4.2f 指格式化为小数,其中.2指保留2位小数。
printf具有自动划分的操作,当传递过来的内容过多的时候,会根据格式来自动划分显示
shell test命令------>[ ]
shell中的test命令用于检查某个条件是否成立。它可以进行数值、字符、文件三个方面的测试。(能和运算符最结合,进行判定工作)
数值测试
参数 说明
-eq 等于则为真
-ne 不等于则为真
-gt 大于则为真
-ge 大于等于则为真
-lt 小于则为真
-le 小于等于则为真
例:判断两个数是否相等
num1=100
num2=100
if test $num1 -eq $num2
then
echo '两个数相等!'
else
echo '两个数不相等!'
fi
数值运算第二种运算方式(推荐使用)
格式:$((运算表达式))
数值运算的这种写法,对括号内的表达式求值,这样声明了一个整型数数据。
注意:
(1) 自定义变量赋值时,"="左右两边都不能有空格。
(2) BASH中的语句结尾不需要分号。
(3)若变量内容由用户决定,可以使用"read"命令从终端键盘获取用户的输入值。
字符串测试
参数 说明
= 等于则为真
!= 不相等则为真
例:判断两个字符串是否相等
num1="qweqwe"
num2="asdasd"
if test $num1 = $num2
then
echo '两个字符串相等!'
else
echo '两个字符串不相等!'
fi
文件测试
参数 说明
-e 如果文件存在则为真
-r 如果文件存在且可读则为真
-w 如果文件存在且可写则为真
-x 如果文件存在且可执行则为真
-s 如果文件存在且至少有一个字符则为真
-d 如果文件存在且为目录则为真
-f 如果文件存在且为普通文件则为真
例:判断文件是否存在
cd /root
if test -e 1
then
echo 'yes!'
else
echo 'no!'
fi
在判断条件中,如果出现与(-a)或(-o) 非(!),优先级顺序为非(!)最高,与(-a)第二, 非(-o)最后。