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