来来回回兜兜转转,又回到了Linux的学习。。。。
大假期学习充电冲冲冲!!!
shell语言
一、概述与总结
shell是一个用c语言写的程序,它是用户与C语言之间的桥梁,是一种命令语言,也是一种程序设计语言。是一种应用程序,提供了一个界面,用户可以通过界面访问Linux内核的服务。Shell脚本(shell script),是一种为shell编写的脚本程序。
Shell环境:
1、Bourne Shell(/usr/bin/sh或/bin/sh/)
2、Bourne Again Shell(/bin/bash)
3、C Shell(/usr/bin/csh)
4、K Shell(/usr/bin/ksh)
5、Shell for Root(/sbin/sh)
在实际运用中多为Bash,也就是Bourne Again Shell(系统默认)使用时要特别标注
#!/bin/bash #!是告诉系统默认的编译器
程序创建中一般使用vi/vim,扩展名在Linux中 一般不用特别说明都指代是文本文件
运行代码的环境我们首先要到对应的目录中去:Linux中目录与文件有着严格的区分,与Windows不同,并且必要的时候给程序添加对应的执行权限
运行程序的两种方法:
1、作为可执行程序(前提添加了可执行的权限)
运行时要对文件进行标识文件前面加入 ./ + 文件名,而不是直接使用文件名,直接使用文件名的后果是Linux将从Path中寻找对应的环境变量,默认情况下环境变量中有/bin,/sbin, /usr/bin
2、作为解释器参数
这种方法是直接运行解释器,其参数就是shell对应的脚本名称(这种方法会忽略对应的文件中头一行写的解释器)
/bin/sh /bin/php
二、Shell 变量
定义变量名,必须要加美元符号,但是要切记变量名和等号之间不能有空格,且必须遵守对应的规则:
1、命名只能使用英文字母,数字和下划线(_)
2、中间不能含有空格,可以使用下划线
3、不能使用标点符号
4、不能使用对应的关键字
使用变量名:要在对应的变量前面添加$美元符号,里面可以恰当的添加()用来限定范围方便程序运行时使用
设置只读变量(readonly)。在规定的变量名字前加readonly
删除变量:使用unset命令可以删除变量,注意这个删除运算无法对只读的文件进行删除,只读变量的删除可以交给root用户或者关机
变量的类型:
1、局部变量:局部变量在脚本或者在命令中定义,仅在当前shell实例中有效,其他的shell启动的程序不能访问局部变量
2、环境变量:所有程序,包括shell启动的程序都能访问环境变量,有些环境变量是保证程序的正常运行,必要的时候可以在shell脚本中定义相应的环境变量
3、shell变量:是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些都是用来保证shell脚本的正常的运行
shell字符串
字符串可以用单引号也可以使用双引号,也可以不使用引号
单引号的限制:单引号的任何字符都会原样输出,单引号字符串中的变量是无效的。
双引号中可以存在变量与单引号不同并且可以出现转义字符。
注意shell里面的拼接与一般语言的拼接略有不同。
获取字符串的长度
使用$(#字符串名)
提取字符串中个别字符
$(字符名: 1:4 ) 从字符串的第二个字符开始截取到第四个字符
查找子字符串的位置
string=“runnoob is a great site”
echo `expr index “$string” io` #输出的结果是4
`是反引号 不是单引号
Shell数组
bash支持一维数组(不支持多维数组),并且没有限制数组的大小
在shell中,用括号来表示数组,数组的元素用“空格”符号分隔开。定义数组的一般形式为: 数组名=(值1 值2 值3 )
读取数组时,一般格式为 ${数组名[下标]}
获取数组长度 ${#数组名[@/*/n]}
Shell注释
单行:以#开头的就是注释,会被解释器忽略
多行:直接变成不使用的函数/多行注释的形式
:<<EOF
…
…
EOF
EOF为自取值,可以发生更改
三、Shell传递参数
脚本内获取参数的格式为:$n n代表一个数字 $0 代表文件名字 $1代表第一个参数…
(为没有执行权限的文件添加文件执行权限)
使用方法:执行文件的同时在执行文件的后面添加指定 加入参数 ./文件名 1 2 3
$# 传递到脚本的参数个数
∗ 以 一 个 字 符 串 显 示 当 前 所 有 向 脚 本 传 递 的 参 数 ( * 以一个字符串显示当前所有向脚本传递的参数( ∗以一个字符串显示当前所有向脚本传递的参数(@ 功能大似相同 不同的时$@ 返回的是不同的参数)
$$ 脚本运行的当前进程ID号
$! 后台运行的当前进程ID号
四、Shell基本运算符
原生bash不支持简单的数学运算,需要用其他命令来实现,awk、expr(这是最常用的)expr是一款表达式计算工具,使用它能完成表达式的求值操作,并且使用的时候要使用``(反引号包括起来)
注意:1、表达式和运算符之间要有空格, 2 + 2
2、完整的表达式要被 `` 包含
算术运算符
运算符 | 说明 | 举例 |
---|---|---|
+ | 加法 | 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。 |
注意:表达式中符号与变量之间必须要用空格进行分隔
关系运算符
关系运算符只支持数字,不支持字符串,除非字符串是数字
下表列出了常用的关系运算符,假定变量 a 为 10,变量 b 为 20:
运算符 | 说明 | 举例 |
---|---|---|
-eq | 检测两个数是否相等,相等返回 true。 | [ $a -eq $b ] 返回 false。 |
-ne | 检测两个数是否不相等,不相等返回 true。 | [ $a -ne $b ] 返回 true。 |
-gt | 检测左边的数是否大于右边的,如果是,则返回 true。 | [ $a -gt $b ] 返回 false。 |
-lt | 检测左边的数是否小于右边的,如果是,则返回 true。 | [ $a -lt $b ] 返回 true。 |
-ge | 检测左边的数是否大于等于右边的,如果是,则返回 true。 | [ $a -ge $b ] 返回 false。 |
-le | 检测左边的数是否小于等于右边的,如果是,则返回 true。 | [ $a -le $b ] 返回 true。 |
布尔运算符
运算符 | 说明 | 举例 |
---|---|---|
! | 非运算,表达式为true 则返回为false,否则返回 true | [ ! false ] 返回true |
-o | 或运算,有一个表达式为真 则返回结果为真 | [ $a -lt 20 -o $b -gt 100 ] 返回为true |
-a | 与运算,有两个表达式都为true,结果才为true | [ $a -lt 20 -a $b -gt 100 ] 返回false |
逻辑运算
运算符 | 说明 | 举例 |
---|---|---|
&& | 逻辑的 AND | [[ $a -lt 100 && $b -gt 100 ]] 返回 false |
|| | 逻辑的 OR | [[ $a -lt 100 || $b -gt 100 ]] 返回 true |
字符串运算符
运算符 | 说明 | 举例 |
---|---|---|
= | 检测两个字符串是否相等,相等返回 true。 | [ $a = $b ] 返回 false。 |
!= | 检测两个字符串是否相等,不相等返回 true。 | [ $a != $b ] 返回 true。 |
-z | 检测字符串长度是否为0,为0返回 true。 | [ -z $a ] 返回 false。 |
-n | 检测字符串长度是否不为 0,不为 0 返回 true。 | [ -n “$a” ] 返回 true。 |
$ | 检测字符串是否为空,不为空返回 true。 | [ $a ] 返回 true。 |
文件测试运算符
操作符 | 说明 | 举例 |
---|---|---|
-b file | 检测文件是否是块设备文件,如果是,则返回true | [ -b $file ] 返回false |
-c file | 检测文件是否是字符设备文件,是—true | [ -c $file ] |
-d file | 检测文件是否为目录 是—true | [ -d $file ] |
-f file | 检测文件是否为文件 是—true | [ -f $file ] |
-r file | 检查文件是否为可读 | [ -r $file ] |
-w file | 检测文件是否可写 | [ -w $file ] |
-x file | 检测文件是否可操作 | [ -x $file ] |
-s file | 检测文件是否为空 | [ -s $file ] |
-e file | 检测文件(或者目录)是否存在 | [ -e $file ] |
五、Shell echo命令
1、显示变量
read命令从标准输入中读取一行,并把输入行的每一个字段指定给shell变量
read name
echo “$name It is a test”
2、显示换行
echo -e “aaaas \n”
3、显示不换行
echo -c “\c”
4、显示结果定向至指定文件
echo “It is a test” > myfile
5、echo 不支持转义字符的使用
6、显示命令执行结果时,需要饭一字符
六、Shell printf命令
printf 与 echo 相似,不同的是printf拥有的处理文字格式比echo要多,但对于printf来说需要在文件后面添加 \n
%-10s %-2.2f 保留10个字符的位置 后面有2个字符位置
相对的转义序列
七、Shell test
用于检查某个条件是否成立,它可以进行数值、字符和文件
数值测试
参数 | 说明 |
---|---|
-eq | 等于则为真 |
-ne | 不等于则为真 |
-gt | 大于则为真 |
-ge | 大于等于则为真 |
-lt | 小于则为真 |
-le | 小于等于则为真 |
字符串测试
参数 | 说明 |
---|---|
= | 等于则为真 |
!= | 不相等则为真 |
-z 字符串 | 字符串的长度为零则为真 |
-n 字符串 | 字符串的长度不为零则为真 |
文件测试
参数 | 说明 |
---|---|
-e 文件名 | 如果文件存在则为真 |
-r 文件名 | 如果文件存在且可读则为真 |
-w 文件名 | 如果文件存在且可写则为真 |
-x 文件名 | 如果文件存在且可执行则为真 |
-s 文件名 | 如果文件存在且至少有一个字符则为真 |
-d 文件名 | 如果文件存在且为目录则为真 |
-f 文件名 | 如果文件存在且为普通文件则为真 |
-c 文件名 | 如果文件存在且为字符型特殊文件则为真 |
-b 文件名 | 如果文件存在且为块特殊文件则为真 |
八、Shell 流程控制
shell的控制语句没有则不写,但是不能为空
if
if condition
then
command 1
commend 2
fi
写成一行 if [ $(ps -ef | grep -c “ssh”) -gt 1 ]; then echo “ true” ; fi
后面的 fi 是 if 倒过来的结构
if else
if condition
then
command 1
command 2
else
command 3
fi
一行式子:if [ ] ; then command 1;else [] ; fi
if else-if else
if condition
then
command 1
elif
condition
then
command 2
else
command 3
fi
一行式子:if condition then command 1 elif condition2 then command 2 else command 3 fi;
for 循环
for var in item1 item2 item3
do
command 1
command 2
done
一行式子:for var in item1 item2 …;do command 1 commend 2 done;
while 语句
while 循环用于不断执行一系列命令,也用于从输入文件中读取数据,通常被视为测试条件。
while condition
do
command
done
无限循环
while :
do
command
done
until 循环
until 循环执行一系列命令直至条件为true时 停止
until condition
do
command
done
返回为false时 才能继续解决
case
Shell case语句为多选择语句,一个case 语句匹配一个操作,如果匹配成功,则执行相匹配的文件
case 值 in
case $n in
1) …
2)…
…
*) 如果无一匹配模式,则使用 *) 捕获命令进行后续操作
;;
esac
1|2|3|3) …
跳出循环
break 命令: 直接跳出当前循环
continue 命令:只能跳出当前的一次循环
case…esac
多分支选择结构
case 值 in
模式1)
command1
command2
command3
;;
模式2)
command1
command2
command3
;;
*)
command1
command2
command3
;;
esac
九、Shell函数
为用户定义函数,然后在shell脚本中进行使用
[ function ] funname [ () ]
{
action ;
[return int ; ]
}
简化形式:
domeFun(){
echo “ ”
}
带有返回值的函数
funWithReturn(){
echo
return $(( x 1 + x1+ x1+x2 ))
}
echo $? 函数返回值在调用该函数后通过 $? 来获取
函数参数
在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数…
funWithParam(){
echo "第一个参数为 $1 !"
echo "第二个参数为 $2 !"
echo "第十个参数为 $10 !"
echo "第十个参数为 ${10} !"
echo "第十一个参数为 ${11} !"
echo "参数总数有 $# 个!"
echo "作为一个字符串输出所有参数 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73
当参数的个数大于10后, 获取参数的方法为${n}
十、Shell输入/输出重定向
一般的定向输入输出是键盘和显示器,重定向改变终端显示到固定的文件夹中
重定向命令列表如下:
命令 | 说明 |
---|---|
command > file | 将输出重定向到 file。 |
command < file | 将输入重定向到 file。 |
command >> file | 将输出以追加的方式重定向到 file。 |
n > file | 将文件描述符为 n 的文件重定向到 file。 |
n >> file | 将文件描述符为 n 的文件以追加的方式重定向到 file。 |
n >& m | 将输出文件 m 和 n 合并。 |
n <& m | 将输入文件 m 和 n 合并。 |
<< tag | 将开始标记 tag 和结束标记 tag 之间的内容作为输入。 |
输出重定向
箭头方向取反
多个重定向:command < infile > outfile
执行命令command,从文件infile中读取数据,输出到outfile
般情况下,每个 Unix/Linux 命令运行时都会打开三个文件:
- 标准输入文件(stdin):stdin的文件描述符为0,Unix程序默认从stdin读取数据。
- 标准输出文件(stdout):stdout 的文件描述符为1,Unix程序默认向stdout输出数据。
- 标准错误文件(stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息。
默认情况下,command > file 将 stdout 重定向到 file,command < file 将stdin 重定向到 file。
/dev/null 文件 执行文件 并将文件的结果返回给/dev/null相当于垃圾桶
十一、Shell 文件包含
简单来说 就是文件变量相互调用