在学习Shell脚本编程就要先了解什么是Shell脚本编程
Shell是一个命令解释器,它在操作系统的最外层,负载直接与用户对话,把用户的输入解释给操作系统,并处理各种各样的操作系统的输出结果,输出到屏幕并返回给用户。这种对话方式可以是交互的方式(从键盘输入命令,可以立即得到shell的回应),或非交互式(执行脚本程序)的方式。
当linux命令或语句不在命令行下执行(严格说,命令行执行的语句也是shell脚本),而是通过一个程序文件执行时,该程序就被称为shell脚本或shell程序,shell程序很类似DOS系统下的批处理程序。这些命令、变量和流程控制语句结合起来就形成了一个功能强大的shell脚本。
在学习shell脚本编程之前还需要安装gcc编译:
[root@localhost ~]# yum install gcc -y
下载完成之后就可以开始学习shell脚本的编程了
我的第一个shell脚本是这样做的:
先打开文本编辑器(可以使用 vi/vim 命令来创建文件),新建一个文件 test.sh,扩展名为 sh(sh代表shell),扩展名并不影响脚本执行。
输入一些代码,第一行一般是这样:
#!/bin/bash
echo "Hello World !"
#! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。
echo 命令用于向窗口输出文本。
运行 Shell 脚本有两种方法:
1、作为可执行程序
将上面的代码保存为 test.sh,并 cd 到相应目录:
chmod +x ./test.sh #使脚本具有执行权限
./test.sh #执行脚本
2、作为解释器参数
这种运行方式是,直接运行解释器,其参数就是 shell 脚本的文件名,如:
/bin/sh test.sh
/bin/php test.php
不过我们还需要注意这些:
1.必须是root才能执行脚本,否则给出友好提示并终止程序运行
2.成功切换目录(cd/var/log),否则给出友好提示并终止运行
3.清理日志(cat /dev/null >messages)清理成功,给出正确提示
4.给出相应提示(echo 输出)
关于Shell的基本写法:
vim /mnt/XXXX.sh
#!/bin/bash
执行:(1) sh XXXX.sh
(2) chmod +x /mnt/XXXX.sh
/mnt/XXXXX.sh
关于sh和bash的区别
早期的Bash与sh稍有不同,它还包含了csh和ksh的特色,但大多数脚本都可以不加修改地在sh上运行
在Shell中依然存在和注释但是和C又有一些不一样:
在shell脚本中,跟在(#)井号后面的内容表示注释,用来对脚本进行注释说明,注释部分不会被当做程序执行,仅仅给用户看,系统解析器是看不到,更不会执行。
Shell脚本编程常用的命令
diff
diff命令是以逐行的方式,比较文本文件的异同处。如果该命令指定进行目录的比较,则将会比较该目录中具有相同文件名的文件,而不会对其子目录文件进行任何比较操作。
使用规则:
diff [options] target1 target2
diff file1 file2
diff direcory1 directory2
#输出结果含义:
[num1,num2][a|c|d][num3,num4]
num1,num2表示在第一个文件中的行数
a表示添加----add
c表示更改----change
d表示删除----delete
<表示第一个文件中的内容,>表示第二个文件中的内容,—分割线
num3,num4表示在第二个文件中的行数
2,4c2,4表示改变第一个文件中的第二行和第四行才能匹配第二个文件中的第二行和第四行
#参数:
-b或–ignore-space-change 不检查空格字符的不同
-B或–ignore-blank-lines 不检查空白行
-c 显示全部内文,并标出不同之处
-i或–ignore-case 不检查大小写的不同
-p:若比较的文件为C语言的程序码文件时,显示差异所在的函数名称;
-q或–brief:仅显示有无差异,不显示详细的信息
-r或–recursive:比较子目录中的文件
-u 以合并的方式来显示文件内容的不同
cut
cut 命令多用与字符截取
cut -d ##指定分隔符
cut -f 1,7(第1和第7列)|1-7 (第一到第七列) ##指定截取的列
cut -c 1,4(第一个分隔符前和第四个分隔符前内容)|1-4(第一个分隔符到第四个分隔符) ##指定截取的字符位置
uniq
uniq:重复字符做相应的处理
uniq -u 显示唯一的行
uniq -d 显示重复的行
uniq -c 每行显示一次并统计重复次数
sort
sort:多用于字符排序
sort -n 纯数字排序
sort -r 倒序
sort -u 去掉重复数字
sort -o 输出到指定文件中
sort -t 指定分隔符
sort -k 指定要排序的列
test命令
test命令和[]等同
test “A"“A”“B” 等同 [ “A”“A”"B” ]
[ “
A
"
=
=
"
A" == "
A"=="B” ] #等于
[ “
A
"
!
=
"
A" != "
A"!="B” ] #不等于
[ “
A
"
−
e
q
"
A" -eq "
A"−eq"B” ] #等于
[ “
A
"
−
n
e
"
A" -ne "
A"−ne"B” ] #不等于
[ “
A
"
−
l
e
"
A" -le "
A"−le"B” ] #小于等于
[ “
A
"
−
l
t
"
A" -lt "
A"−lt"B” ] #小于
[ “
A
"
−
g
e
"
A" -ge "
A"−ge"B” ] #大于等于
[ “
A
"
−
g
t
"
A" -gt "
A"−gt"B” ] #大于
[ “
A
"
−
n
e
"
A" -ne "
A"−ne"B” -a “
A
"
−
g
t
"
A" -gt "
A"−gt"B” ] #整数1不等于整数2话并且整数1大于整数2
[ “
A
"
−
n
e
"
A" -ne "
A"−ne"B” -o “
A
"
−
g
t
"
A" -gt "
A"−gt"B” ] #整数1不等于整数2话或者整数1大于整数2
[ -z “KaTeX parse error: Expected 'EOF', got '#' at position 6: A" ] #̲字符串的长度是否为零 [ -n…A” ] # 字符串的长度非零
[ “file1” -ef “file2” ] #两个文件是否为同一个文件,可用于硬连接。主要判断两个文件是否指向同一个inode。
[ “file1” -nt “file2” ] #判断文件1是否比文件2新
[ “file1” -ot “file2” ] #判断文件1比是否文件2旧
[ -e “file” ] #如果文件存在,则为真;
[ -f “file” ] #如果文件为一个普通文件,则为真;
[ -S “file” ] #如果文件为一个套接字特殊文件,则为真;
[ -b “file” ] #如果文件为一个块特殊文件,则为真;
[ -d “file” ] #如果文件为一个目录,则为真;
[ -c “file” ] #如果文件为一个字符特殊文件,则为真;