首页
学习
活动
专区
工具
TVP
发布

Shell速成手册-超级总结篇

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——

关于程序媛的点滴,技术/职场/生活。

欢迎来稿~

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180920G0CWLJ00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券