Shell语言是学习Linux的基础,划重点考试肯定会考的。
01|快捷键
ctrl+c 强制终止命令
ctrl+L 清屏
ctrl+a 跳到行首
ctrl+e 跳到行尾
ctrl+u 删除从光标到行首
02|输出重定向
将本身应该显示在屏幕上的命令写入文件中
ls >test.log 将ls命令的结果覆盖到test.log文件
ls >>test.log 将ls命令的结果追加到test.log文件
ls 2>test.log 将ls命令的错误信息覆盖到test.log文件 > 左右两边不能有空格
ls 2>>test.log 将ls命令的错误信息追加到test.log文件 >>左右两边不能有空格
重点命令:
ls >> test.log
ls &>>test.log 以追加的方式,把正确和错误的信息输出到同一个文件
ls >>test1.log 2>>test2.log 以追加的方式,把正确的信息输出到文件1,把错误的信息输出到文件2
ls >/dev/null 2&>1 将ls命令的错误信息和正确信息都输出到空设备/dev/null,也就是什么都不显示。
03|多命令执行顺序
date ; ls ;cd /etc ; pwd ;date; 不管中间的命令是否报错 后面的命令还是会执行
date && ls &&cd /etc&& pwd&&date 前一条命令正确执行 才能执行下一条
管道符 命令1|命令2
命令1的输出结果作为命令2的操作对象
例如: netstat -ano|grep ESTABLISHED
netstat -ano | grep ESTABLISHED |wc -l
4|shell变量
用户自定义变量 变量能自定义 变量作用自定义 可以更改值
环境变量 变量自定义 生效后,变量名和作用范围都是固定
位置参数变量 变量不能自定义 变量作用是固定 只能更改值
预定义变量 变量不能自定义 变量作用是固定 只能更改值
【1】用户自定义变量
查看所有变量:set
变量赋值:x=123
变量赋值等号左右不能加空格; x=123
有特殊符号要用单引号或者双引号括起来;
变量调用:echo $变量名
变量的叠加:x=$456
x=123
x="$x"456 方法一
x=$456 方法二
变量删除:unset 变量名
切换父shell和子shell:
bash命令进入子shell
查看shell层级关系:pstree
环境变量是全局变量
用户自定义变量是局部变量
【2】环境变量(一般写成大写)
自定义环境变量例如:export Z=1
查看环境变量env
PATH系统搜索命令的路径
增加PATH的值
PATH="$PATH":/root
PS1命令提示符设置
一般在/etc/bashrc中设置
[root@10-10-237-5 etc]PS2
查看当前系统语系
locale
echo $LANG 对当前系统的语言环境
cat /etc/sysconfig/i18n下次开机时的语言环境
删除环境变量unset Z
【3】 位置参数变量
$n$1-$9 代表第1-9个变量
例子:
#!/bin/bash
num1=$1
num2=$2
sum=$(($num1+$num2))
echo $sum
[root@10-10-237-5 etc] ./a.sh 11 22
[root@10-10-237-5 etc]33
$*返回所有参数 把所有参数看成整体
例子:
#!/bin/bash
for i in "$*"
do
echo $i
done
[root@10-10-237-5 etc] ./b.sh 1 2 3 4 5
[root@10-10-237-5 etc]1 2 3 4 5
$@返回所有参数 把参数区分对待
例子:
#!/bin/bash
for i in "$@"
do
echo $i
done
[root@10-10-237-5 etc] ./b.sh 1 2 3 4 5
[root@10-10-237-5 etc]1
[root@10-10-237-5 etc]2
[root@10-10-237-5 etc]3
[root@10-10-237-5 etc]4
[root@10-10-237-5 etc]5
$#返回参数个数
【4】预定义变量
echo $?
如果值为0 表明上一条命令被正确执行
如果值为非0 表明上一条命令未正确执行
echo $$返回当前进程号
【5】read 接收输入命令
-p 提示信息
-t 等待的时间
-s 隐藏
-n 字符数 只接受指定的字符数就执行
read -p "enter your name": -t 30 name
echo $name
read -p "enter your passwd": -s passwd
echo $passwd
read -p " enter your sex[M/F]": sex
echo $sex
05|环境变量配置文件
【1】基础配置文件
作linux中所有以.开头的文件都是隐藏文件,系统主要生效的配置文件:
/etc/profile 定义环境变量
.bash_profile 调用了.bashrc;并在PATH中加入了/bin这个目录
.bashrc 调用了/etc/bashrc ;并定义了别名
/etc/bashrc中定义了变量PS1;
有完整用户名和密码登陆时,环境变量配置文件加载的顺序如下:
切换用户时,
【2】配置文件中的umask命令
umask 系统默认权限中需要丢掉的权限 022
文件的默认权限rw-rw-rw-(666)丢掉 ----w--w-(022)剩下rw-r--r--644
目录的默认权限rwxrwxrwx(777)丢掉 ----w--w-(022)剩下rwxr-xr-x755
文件的最高权限666 rw-rw-rw-
目录的最高权限777 rwxrwxrwx
提示出问题变成原始的 bash5.2# ,表明加载中的配置文件丢失
【3】其他配置文件
注销时生效的环境变量配置文件
~/.bash_logout 默认是空文件
mysql在设置本地登陆密码时都是使用明文,这时候需要删除历史命令。
~/.bash_history 保存历史命令的文件
当前登陆操作的历史命令,还不会出现在.bash_history中,退出时会保存。
/etc/issue 本地终端登陆前的欢迎信息;
/etc/issue.net 远程终端登陆前的欢迎信息设置文件
/etc/motd 登陆后的欢迎信息(适合本地和远程登陆)推荐使用
06|shell变量类型
【1】变量类型的声明
declare -p 查看所有变量的类型
declare -p 变量名 查看指定变量的类型
declare -a 变量声明为数组
declare -i 变量声明为整型
declare -r 变量设置成只读
declare -x 变量声明为环境变量
作用和export一样
举例:读取数组的一般格式:$
[root@10-10-237-5 etc]movie[0]=11
[root@10-10-237-5 etc]movie[1]=22
[root@10-10-237-5 etc]
echo "第一个元素为:$ "
[root@10-10-237-5 etc]
echo "数组的元素为:$ "
[root@10-10-237-5 etc]
echo "数组的元素为:$ "
[root@10-10-237-5 etc]
echo "数组的长度为:${#movie[*]} "
[root@10-10-237-5 etc]
echo "数组的长度为:${#movie[@]} "
07|shell运算符
shell 和其他编程语言一样,支持多种运算符,包括:
算数运算符
关系运算符
布尔运算符
字符串运算符
文件测试运算符
【1】算数运算符
val=`expr $ + $` echo $val
dd=$(expr $aa + $bb) 等号左右一定要空格
$(($num1+$num2))或者
$[$num1+$num2]
【2】关系运算符
【3】布尔运算
-a 逻辑与
-o 逻辑或
!逻辑非
举例1:
[root@10-10-237-5 etc]#
[ -n "$aa" -a "$aa" -gt 23 ] &&echo yes ||echo no
[root@10-10-237-5 etc]# no
[root@10-10-237-5 etc]#
[ -n "$aa" -o "$aa" -gt 23 ] &&echo yes ||echo no
[root@10-10-237-5 etc]# yes
【4】字符串运算
【5】文件测试运算
举例:[ -e /home/lusq/demo.sh ]&&echo yes ||echo no文件是否存在
举例:[ -w /etc/motd ]&&echo yes||echo no 文件是否有写权限
举例:--创建硬链接(2个文件的inode是一样的)
[root@10-10-237-5 etc]#ln /home/lusq/demo.sh /tmp/demo.sh
[root@10-10-237-5 etc]#ll -i 查看文件的inode值
[root@10-10-237-5 etc]# ll -i
total 24
1315987 -rwxr-xr-x 1 root root 148 Jul 20 07:59 canshu.sh
1315989 -rwxr-xr-x 1 root root 159 Jul 23 07:14 declare.sh
1315991 -rwxrwxrwx 2 root root 33 Sep 8 14:22 demo.sh
[root@10-10-237-5 etc]#
[ /home/lusq/demo.sh -ef /tmp/demo.sh ]&&echo yes|| echo no
[root@10-10-237-5 etc]#yes
08|shell函数
linux shell 可以用户定义函数,然后在shell脚本中可以随便调用。
shell中函数的定义格式如下:
[ function ] funname [()]{
aaction;
[return int;]
}
说明:
1、可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。
2、参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255
举例1:
#!/bin/bashdemoFun(){
echo "这是我的第一个 shell 函数!"
}
echo "-----函数开始执行-----"
demoFun
echo "-----函数执行完毕-----"
举例2:
#!/bin/bashfunWithReturn(){
echo "这个函数会对输入的两个数字进行相加运算..."
echo "输入第一个数字: "
read aNum
echo "输入第二个数字: "
read anotherNum
echo "两个数字分别为 $aNum 和 $anotherNum !"
return $(($aNum+$anotherNum))
}
funWithReturn
echo "输入的两个数字之和为 $? !"
输出结果:
这个函数会对输入的两个数字进行相加运算...
输入第一个数字:
1
输入第二个数字:
2
两个数字分别为 1 和 2 !
输入的两个数字之和为 3 !
09|字符串匹配正则表达式
【1】通配符
?任意一个字符
* 任意多个字符
[]匹配括号中的一个字符
can[gy]l 可以匹配 cangl canyl
通配符是用来匹配文件名的,是完全匹配
ls find cp 这些命令不支持正则;
正则表达式是用来在文件中匹配字符串,是包含匹配。
awk sed grep 这些命令支持正则;
【2】基本正则表达式
举例1:*的用法
text.txt
#!/bin/bash
a
aa
aaa
aaaa
ab
abb
b
bb
bbb
bbbb
[root@10-10-237-5 etc]#grep "a*" text.txt
[root@10-10-237-5 etc]#
a
aa
aaa
aaaa
ab
abb
b
bb
bbb
bbbb
[root@10-10-237-5 etc]#grep "aa*" text.txt
[root@10-10-237-5 etc]#
a
aa
aaa
aaaa
ab
abb
举例2:^ $ [] 的用法
text2.txt
#!/bin/bash
12344
22424
dddd445hh
34ggg
[root@10-10-237-5 etc]# grep [0-9] text2.txt
[root@10-10-237-5 etc]#
12344
22424
dddd445hh
34ggg
[root@10-10-237-5 etc]#grep ^[0-9] text2.txt 中括号之外^的代表行首
12344
22424
34ggg
[root@10-10-237-5 etc]#grep [^0-9] text2.txt 中括号之内^的代表取反
dddd445hh
举例3:\ 和 \
text3.txt
a
aa
aaa
xaau
xaaau
xaaaau
xaaaau
ab
abb
[root@10-10-237-5 etc]#grep "a\" text3.txt
[root@10-10-237-5 etc]#grep "xa\u" text3.txt
[root@10-10-237-5 etc]#
xaau
xaaau
举例4:匹配日期YYYY-MM-DD
[root@10-10-237-5 etc]#grep "[0-9]\-[0-9]\-[0-9]\" a.txt
举例5:匹配IP地址
[root@10-10-237-5 etc]#
grep "[0-9]\\.[0-9]\\.[0-9]\\.[0-9]\" b.txt
【3】关键点总结
10|字符截取命令Cut/Awk/Sed
【1】cut [选项] [标志] 列分割 默认用制表符来进行分割
-b 以字节为单位进行分割。
-c 以字符为单位进行分割
-d 自定义分隔符,默认为制表符。
-f 与-d一起使用,指定显示第几列
-n 取消分割多字节字符。和-b一起使用。
如果字符的最后一个字节落在由 -b 标志的
List 参数指示的范围之内,该字符将被写出;否则,该字符将被排除。
有冒号和制表符分割的可用cut来处理,
如果是空格比较复杂的就需要使用awk了。
【2】printf
举例1:
a.txt
ID name sex score
1 lisan F 85
2 lisi F 70
[root@10-10-237-5 etc]#
printf '%s\t%s\t%s\t%s\n' $(cat a.txt)
ID name sex score
1 lisan F 85
2 lisi F 70
【3】awk
举例1:将文件中的第2和4列打印出来
[root@10-10-237-5 etc]#awk '' a.txt
[root@10-10-237-5 etc]#
name score
lisan 85
lisi 70
举例2:查看分区5的使用率是否超过了
[root@10-10-237-5 etc]#df -h |cut -f 5
[root@10-10-237-5 etc]#
df -h |grep "/dev/sda5" |awk '' | cut -d "%" -f 1
举例3:BEGIN END
[root@10-10-237-5 etc]#
awk 'BEGIN' a.txt
[root@10-10-237-5 etc]#
awk 'END' a.txt
---this is a test---
name score
lisan 85
lisi 70
【4】awk的内置变量
举例1:FS 指定分隔符;默认是制表符
[root@10-10-237-5 etc]#cat /etc/passwd |grep /bin/bash
[root@10-10-237-5 etc]#
cat /etc/passwd |grep /bin/bash |awk 'BEGIN'
[root@10-10-237-5 etc]#
root 0
omss 500
【5】awk的关系运算符
a.txt
ID name sex score
1 lisan F 85
2 lisi F 70
举例1:打印分数大于80分的学生名称
grep 的 -v:显示不包含匹配文本的所有行
[root@10-10-237-5 etc]#cat a.txt| grep -v name| awk '$4>80'
[root@10-10-237-5 etc]#lisan
【6】sed 对数据进行选取 替换 删除 增加
举例1:插入
[root@10-10-237-5 etc]#
sed -n '2p' a.txt (输出第二行)
[root@10-10-237-5 etc]#
sed '2i meizu 1 98' c.txt
(在第二行前插入,且不修改源文件)
name gender score
meizu 1 98
xiaomi 1 90
huawei 2 98
apple 1 100
举例2:追加
[root@10-10-237-5 etc]#
sed '2a meizu 1 98' c.txt
(在第二行后面追加一行)
name gender score
xiaomi 1 90
meizu 1 98
huawei 2 98
apple 1 100
举例3:删除
[root@10-10-237-5 etc]#sed -i '2d' c.txt
(删除第二行,并且写入文件c.txt中)
举例4:替换
[root@10-10-237-5 etc]#
sed '3s/meizu//g' c.txt
(替换第三行的字符串)
name gender score
xiaomi 1 90
1 98
huawei 2 98
apple 1 100
举例5:多行替换
[root@10-10-237-5 etc]#
sed -e '3s/meizu//g;3s/98//g' c.txt
(替换第三行的多处字符串)
11|流程控制
【1】if语句控制:
if [ 条件判断式 ];then
程序
fi
或者
if [ 条件判断式 ]
then
程序
fi
【2】if双分支语句控制:
if [ 条件判断式 ]
then
程序
else
程序
fi
【3】if多分支语句控制:
if [ 条件判断式 ]
then
程序
elif [ 条件判断式 ]
then
程序
else
程序
fi
【4】case语句:
case $a in
"123")
do something
;;
"456")
dosomething
;;
*)
dosomething
;;
esac
【5】for语句:
#!/bin/bash # 批量解压缩包
cd /root/test
ls *.tar.gz > ls.log(>覆盖)
ls *.tgz >> ls.log(>>添加)
for i in $(cat ls.log)
do
tar -zxvf $i & > /dev/null
done
rm -rf ls.log
【6】while语句:
【7】until语句:
后记:
这是一篇巨大的总结篇。终于码完了。
汇总一下下:
01|快捷键
02|输出重定向
03|多命令执行顺序
04|shell变量
05|环境变量配置文件
06|shell变量类型
07|shell运算符
08|shell函数
09|字符串匹配正则表达式
10|字符截取命令Cut/Awk/Sed
11流程控制
——END——
关于程序媛的点滴,技术/职场/生活。
欢迎来稿~
领取专属 10元无门槛券
私享最新 技术干货