Shell知识点回顾

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值