Linux命令补充:
Shell脚本:
一、入门
1.脚本格式:以#!/bin/bash开头(指定解析器)
2.脚本的常用执行方式:
(1)bash/sh + 脚本的相对路径或绝对路径(不用赋予脚本+x 权限)
(2)输入脚本的绝对路径或相对路径(必须具有可执行权限+x)
(3)其他方法
二、变量
1.系统预定义变量
(1)查看系统变量的值:echo $HOME
(2)显示当前shell中所有的变量:set
2.自定义变量
(1)定义变量:变量名=变量值(等号前后不能有空格)
(2)撤销变量:unset 变量名
(3)声明静态变量:randonly 变量,不能 unset
注意:(1)变量的值如果有空格,需要使用双引号或单引号阔起来
(2)可把变量提升为全局环境变量,可供其他shell程序使用: export 变量名
3.特殊变量
(1)$n:n为数字,$0表示该脚本名称,$1-$9代表第一到第九个参数,十以上的参数用大括号包含,如${10}
(2)$#:获取所有输入参数个数,常用于循环,判断参数个数是否正确
(3)$*:代表命令行中所有的参数,把所有的参数看成一个整体
(4)$@:代表命令行中所有的参数,把每个参数区分对待
(5)$?:最后一次执行的命令的返回状态,如果为0,则说明上一个命令正确执行,非0则说明命令执行不正确。
三、运算符
1.基本语法:$((运算式))或$[运算式]
如:S=$[(2+3)*4]
echo $S
四、条件判断
1.基本语法
(1)test condition
(2)[ condition ](注意condition前后要有空格)
注意:条件非空即为true
2.常用判断条件
(1)两个整数之间比较
-eq 等于 -ne 不等于 -lt 小于 -le 小于等于 -gt 大于 -ge 大于等于
如:[ 23 -gt 24 ] #23是否大于24
注:如果是字符串之间的比较,用等号"="判断相等;用“!=”判断不等
(2)按照文件权限进行判断
-r:可读 -w:可写 -x:可执行
如:[ -w helloworld.sh ] #helloworld.sh是否具有写权限
(3)按照文件类型进行判断
-e:文件存在 -f:文件存在并且是一个常规的文件 -d:文件存在且是一个目录
如:[ -e /home/user/cls.txt ] #/home/user/cls.txt目录中的文件是否存在
(4)多条件判断(&&表示前一条命令执行成功时才执行后一条命令,||表示上一条命令执行失败后,才执行下一条命令)
如:[ ] && echo OK || echo notOK
五、流程控制
1.if判断-基本语法
(1)单分支
if [ 条件判断式 ];then
程序
fi
if [ 条件判断式 ]
then
程序
fi
(2) 多分支
if [条件判断式]
then
程序
elif [条件判断式]
then
程序
else
程序
fi
注意:(1)[ 条件判断式 ],中括号和判断式之间必须有空格
(2)if后要有空格
2.case 语句-基本语法
case $变量名 in
"值1")
如果变量的值等于值1,则执行程序1
;;
"值2")
如果变量的值等于值2,则执行程序2
;;
...省略其他分支...
*)
如果变量的值都不满足,则执行程序
;;
esac
注意:(1) case 行尾必须为单词“in”,每一个模式匹配必须以右括号“)”结束
(2)双分号“;;”表示命令序列结束,相当于break
(3)最后的“*)”表示默认模式,相当于default
3.for循环
(1)基本语法
for((初始值;循环控制条件;变量变化))
do
程序
done
for 变量 in 值1 值2 值3…
do
程序
done
4.while循环
(1)基本语法
while [条件判断式]
do
程序
done
案例:从1加到100
六、read读取控制台输入
1.基本语法:read [ -p -t ] 读取值的变量名
-p:指定读取值时的提示符
-t:指定读取值时等待的时间,如果不加则表示一直等待
七、函数
1.系统函数-basename
(1)基本语法:basename [string/pathname] [suffix]
功能:basename命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来。相当于取路径里的文件名称。
选项:suffix为后缀,如被指定,则basename会将pathname或string中的suffix去掉。
2.系统函数-dirname
(1)基本语法:dirname 文件绝对路径
功能:取文件路径的绝对路径名称
3.自定义函数
(1)基本语法:
[ function ] funname [ () ]
{
Action;
[ return int; ]
}
注:函数返回值,只能通过$?系统变量获得,可以显示加return 返回,如果不加,将以最后一条命令运行结果作为返回值。return后跟数值n(0-255)。
八、正则表达式入门
1.作用:通常用于检索、替换那些符合某个模式的文本。
2.常规匹配:一串不包含特殊字符的正则表达式匹配自己本身。
3.常用特殊字符:
(1)^:匹配一行的开头
如:cat /etc/passwd | grep ^a (会匹配出所有以a开头的行)
(2)$:匹配一行的结束
如: cat /etc/passwd |grep t$ (会匹配所有以t结尾的行)
注:^$匹配的是空
(3) . :匹配一个任意的字符
如: cat /etc/passwd |grep r..t (会匹配包含tabt、rbbt、root等的所有行)
(4)* :不单独使用,和上一个字符连用,表示匹配上一个字符的0次或多次
如:cat /etc/passwd |grep ro*t (会匹配rt、rot、root、rooot等所有行)
注:.*匹配任意字符零次或多次
(5)字符区间 [ ] :表示匹配某个范围内的一个字符
如:[6,8]:匹配6或8 [0-9]:匹配一个0-9的数字
[0-9]*:匹配任意长度的数字字符串 [a-z]:匹配任意长度的字母字符串
[a-c,e-f]:匹配a-c或者e-f之间的任意字符
(6)\ :表示转义,并不会单独使用。将转义字符与特殊字符连用,来表示特殊字符本身
如:cat /etc/passwd |grep 'a\$b' (匹配包含a$b的所有行)
注意需要用单引号将表达式引起来。
九、文本处理工具
1.cut:从文件的每一行剪切字节、字符和字段并将其输出
(1)基本用法:cut [ -f -d -c ] filename
默认分隔符为制表符
(2)选项参数
-f:列号,提取第几列
-d:分隔符,按照指定分隔符分割列(默认为\t)
-c:按字符进行切割,后加n表示取第几列 ,如 -c 1
2.awk:把文件逐行读入,以空格为默认分隔符将每行切片,切开部分在进行分析处理
(1)基本用法:
awk [ -F -v ] '/pattern1/{action1} /pattern2/{action2} ...' filename
pattern:表示awk在数据中查找的内容,就是匹配模式
action:在找到匹配内容时所执行的一系列命令
(2)选项参数:
-F:指定输入文件的分隔符
-v:赋值一个用户定义变量
如:只显示/etc/passwd的第一列和第七列,以逗号分隔,且在所有行前面加列名user,shell,在最后一行添加end。
awk -F : 'BEGIN{print "user,shell"} {print $1","$7} END{print "end"}' passwd
其中$1和$7分别表示第一列和第七列 。
如:将passwd文件中用户id增加数值1并输出
awk -v i=1 -F : '{print $3+i}' passwd
注意:(1)只有匹配了pattern的行才会执行action
(2)BEGIN在所有数据读取行之前执行,END在所有数据执行后执行
(3)awk的内置变量:
FILENAME:文件名
NR:已读的记录数(行号)
NF:浏览记录的域的个数(切割后列的个数)
如:查询ifconfig命令输出结果中的空行所在的行号
ifconfig | awk '/^$/{print NR}'