shell基本的语法:
定义变量:key=value
注意:等号两边不能有空格,使用字母数字下划线命名,但是不能以数字开发头,系统变量建议全大写字母
撤销变量使用的是:unset命令
声明静态变量:readonly 变量 注意:不能unset
变量的值如果有空格,那么要加引号,默认是字符串,不能进行运算;
export将变量提升为全局变量
特殊变量:
$n : n是数字,$0表示该脚本的名称,$1~$9代表第一个到第九个参数,10以上的擦拭农户,需要用大括号包含,${10}
$# : 获取所有输入参数的个数,常用用循环
$* : 代表命令行中所有的参数,$*把所有的参数看成是一个整体
$@ :这个参数也是表示命令行中所有的参数,不过$@把每个参数区分对待
$? : 最后一次执行的命令的返回状态,如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0,证明上一个命令执行不正确
运算符
1、$((运算式)) 或者 $[运算式]
2、expr +、-、\*、/、% 注意运算符两侧要有空格
条件判断:
[ condition ] 注意:condition前后要有空格,条件非空就是true
常用的判断条件:
1、两个整数之间的比较:= 字符串的比较 -lt 小于 -le 小于等于 -eq 等于 -gt 大于 -ge 大于等于 -ne 不等于
2、按照文件权限进行判断 -r 有读权限 -w 有写权限 -x 有可执行权限
3、按照文件的类型进行判断 -f 文件存在并且是一个常规的文件(file) -e 文件存在 -d 文件存在并且是一个目录
4、多条件判断 使用&& 表示前一条命令执行成功时,才执行后面一条命令, ||表示上一条命令执行失败之后才执行下一条命令
流程控制:
1、if判断
if [ 条件判断式 ];then
程序
if
或者
if [ 条件判断式 ]
then
程序
elif [ 条件判断式 ]
then
程序
else
程序
fi
注意事项:中括号和条件判断式之间必须要有空格 if后要有空格
case 语法
case $变量名 in
"值1")
如果等于值1,则执行程序1
;;
"值2")
如果等于值1,则执行程序2
;;
"值3")
如果等于值1,则执行程序3
;;
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac
注意:
case行尾必须为单词 in 每一种模式匹配必须以右括号 )结束。
双分号 ;; 表示命令序列结束,相当于java中的break
最后 *) 表示默认模式,相当于java中的default
for循环
for (( 初始值;循环控制条件;变量变化 ))
do
程序
done
for 变量 in 值1 值2 值3 ....
do
程序
done
比较$*与$@的区别:
1、$*和$@都表示传递函数或脚本的所有参数,不被双引号""包含时,都以$1$2...$n的形式输出所有参数
2、当被双引号""包含时,$*会将所有的参数作为一个整体,以"$1$2...$n"的形式输出所有的参数,$@怎会将各个参数分开表示
while循环
while [ 条件判断式 ]
do
程序
done
read读取控制台控制
read 选项 参数
选项:
-p :指定读取值时的提示符;
-t :指定读取值时等待的时间(秒)
参数:
变量 :指定读取值的变量名
函数:
系统函数:
basename基本语法
basename [string/pathname] [suffix] 注:basename命令会删掉所有的前缀包括最后一个("/")字符,然后将字符串显示出来
选项:suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉。
dirname 文件的绝对路径 注:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),返回路径(目录的部分)
自定义函数
[ function ] funname[()]
{
Action;
[return int;]
}
funname
注意:
函数必须先声明,后调用;
函数的返回值只能通过$?系统变量获取,可以显示的加return返回,如果不加将以最后一条命令运行的结果作为返回值
shell工具
cut命令
cut [选项参数] filename
选项:
-f : 列号,提取第几列
-d : 分隔符,按照指定分隔符分割列
-c : 指定具体的字符
案例:
1、按照"-"切分列,并切割第一列
cut -d "-" -f 1 xxx.txt
2、按照"-"切分列,并且切割2,3列
cut -d "-" -f 2,3 xxx.txt
3、在文档中切割出guan
cat cut.txt | grep "guan" | cut -d "-" -f 1
4、选取系统PATH变量值,第2个":"开始后的所有路径:2-表示从第二个开始到后面的所有
echo $PATH | cut -d ":" -f 2-
5、切割ifconfig后打印的IP地址
ifconfig eth0 | grep "inet addr" | cut -d : -f 2 | cut -d " " -f 1
sed命令:
sed是一种流编辑器,一次处理一行内容。
处理时,把当前处理的行存储在临时缓冲区中,称为"模式空间",接着sed命令处理缓冲区中的内容,
处理完成之后,把缓冲区的内容送往屏幕,接着处理下一行,这样不断重复,直到文件末尾。文件内容没有改变,
除非使用重定向存储输出。
sed [选项参数] 'command' filename
选项:
-e : 直接在指令列模式上进行sed的动作编辑
-i : 直接编辑文件
命令:
a : 新增,a的后面可以接字符串,在下一行出现。
d : 删除
s : 查找并替换
案例:
0、数据准备:
touch sed.txt
vim sed.txt
输入一下内容保存;
zhang san
li si
wang wu
xiao ming
hong hong
liang zai
la mei
xiao ying
1、将把 "da ge"这个字符串插入到sed.txt文件的第二行下,打印;
sed '2a da ge' sed.txt
注意:这时候文件内容并没有被改变
2、删除sed.txt文件所有包含xiao的行
sed '/xiao/d' sed.txt
3、将sed.txt文件中xiao替换成a
sed 's/xiao/a/g' sed.txt
注:这里的g表示全局,即:全部替换 global
4、将sed.txt文件中的第二行删除并将xiao替换为a
sed -e '2d' -e 's/xiao/a/g' sed.txt
awk命令:
一个强大的文本分析工具,把文件逐行读入,以空格为默认分隔符将每一行切片,切开的部分在进行分析处理
awk [选项参数] 'pattern1{action1} pattern2{action2}....' filename
parrern :表示AWK在数据中查找的内容,就是匹配模式
action :在找到匹配内容时所执行的一系列命令
选项参数:
-F :指定输入文件拆分隔符
-v :赋值一个用户定义的变量
案例:
0、数据准备:
cp /etc/passwd .
注意:只有匹配了pattern才会执行action
1、搜索passwd文件以root关键字开头的所有行,并输出该行的第7列。
awk -F : '/^root/{print $7}' passwd
2、搜索passwd文件以root关键字开头的所有行,并输出改行的第1列和第7列,中间用逗号分隔
awk -F : '/^root/{print $1,$7}' passwd
3、只显示/etc/passwd的第一列和第七列,以逗号分割,并且在所有行前面(相当于输出的第一行)添加列名user,shell 在最后一行添加"laozhao,/bin/shuaige
awk -F : 'BEGIN{print "user,shell"}{print $1","$7} END{print "laozhao,/bin/shuaige"}' passwd
注:BEGIN表示在所有数据读取之前执行; END表示在所有数据执行之后执行
4、将passwd文件中的用户id增加数值1并输出
awk -v i=1 -F : '{print $3+i}' passwd
awk的内置变量:
FILENAME : 文件名
NR :已读的记录数
NF :浏览记录的域的个数(切割后,列的个数)
案例:
1、统计passwd文件名,每行的行号,每行的列数
awk -F : '{print "filename:" FILENAME ", lineNumber:" NF ",columns:" NF}' passwd
2、切割IP
ifconfig eth0 | grep "inet addr" | awk -F : '{print $2}' | awk -F " " '{print $1}'
3、查询sed.txt中空行所在的行号
awk '/^$/{print NR}' sed.txt
sort命令:
在linux里面非常有用,它将文件进行排序,并将排序结果标准输出
sort (选项) (参数)
选项:
-n : 依照数值的大小排序;
-r :以相反的顺序来排序;
-t : 设置排序时所用的分隔字符
-k : 指定需要排序的列
参数:指定待排序的文件列表
案例:
0、数据准备 sort.txt
bb:40:5.4
bd:20:4.2
xz:50:2.3
cls:10:3.5
ss:30:1.6
按照":" 分割后的第三列倒序排列
sort -t : -nrk 3 sort.txt
企业面试题练习:
问题一:使用Linux命令查询file1中空行所在的行号
awk '/^$/{print NR}' file1
问题二:有文件chengji.txt内容如下:
张三 40
李四 30
王五 50
使用Linux命令计算第二列的和并输出
cat chengji.txt | awk -F " " '{sum+=$2} END{print sum}'
问题三:shell脚本里如何检查一个文件是否存在?如果不存在该如何处理?
#!/bin/bash
if [ -f file.txt ]; then
echo "文件存在!"
else
echo "文件不存在!"
fi
问题四:用shell写一个脚本,对文本中无序的一列数字排序,并求和放在最后一行
sort -t " " -nrk 2 test.txt | awk -F " " '{a+=$2;print $2} END{print "SUM=" a}'
问题五:请用shell脚本写出查找当前文件夹/home下所有的文本文件内容包含有字符"shen"的文件名
grep -r "shen" /home | cut -d ":" -f 1