假期是一个可自由支配的、不太容易被别人打扰的、独自学习的好机会,尤其是对于我这样一个平时还要做试验出data的生物狗来说,更是千载难逢的好机会。之前对shell脚本零零散散地看过,但并不系统,所以通过假期拿出大块的时间来学习。我主要是通过学习极客时间尹会生老师的课“Linux实战技能100讲”,从视频课中记录笔记及加上自己的一些看法和日常练习。希望过完春假,我能独立写一个简单的脚本,让我的双手从单行命令中解放出来。
shell脚本学习
chapter1 什么是shell
1.shell是命令解释器,用于解释用户对操作系统的操作。
2.shell有很多种,cat/etc/shells
3.CentOS7 默认使用的shell是bash,是基于bsh,把bshell好用的功能拿过来,a是again的意思。
4.把脚本写好,用户不用编写程序,也不用开发复杂的C语言。
Chapter 2 linux启动过程
主要是讲了系统自带的shell脚本,对于我而言超纲了,且目前用不到,跳过。
Chapter3 shell脚本的形式
1.UNIX的哲学:一条命令只做一件事。
2.为了组合命令和多次执行,使用脚本文件来保存需要执行的命令。
3.赋予该文件执行权限(chmod u+rx filename
)
一个简单的脚本文件举例:
#进入文件路径并查看内容,显示当前目录和大小
vim 1.sh
cd /var/ ; ls ;pwd ; du -sh #在脚本文件中去掉冒号并变成多行
#赋予权限
chmod u+x 1.sh
#查看其权限
ls -l 1.sh
#运行1
bash 1.sh
#运行2,用系统自带的bash
./1.bash
在vim中脚本中进行声明,解释该脚本用什么来编写,如 #!/bin/bash
。
声明之后再加注释,格式为 #demo
标准的shell脚本要包含哪些元素
1.Sha-Bang:以#!为开头的声明
2.命令
3."#"开头的注释
4.chmod u+rx filename
可执行权限
Chapter4 脚本不同执行方式的影响
5.执行命令
5.1 bash ./filename.sh
可以不赋予执行权限,内建命令会对当前环境造成影响。
5.2./filename.sh
必须要有可执行权限。
5.3 source ./filename.sh
5.4 . ./filename.sh
5.3和5.4与上述两个不同,是在当前路径进行执行,内建命令不产生子进程,会对当前环境造成影响。如果有cd
命令,脚本运行结束后当前路径也会发生变化。5.1和5.2运行后会产生新的子进程,运行结束后再从子进程回到父进程,如果脚本中有cd
命令,脚本结束后会回到当前目录,所以对当前环境没有影响。
举例:
vim 2.sh
#!/bin/bash
# demo
内建命令和外部命令的区别
1.内建命令不需要创建子进程,如cd,pwd。
2.内建命令对当前Shell生效。
Chapter 5 管道
1.管道与管道符
1.1管道和信号一样,也是进程通信的方式之一。
举例:
cat | ps -f
管道符与分号不同,分号是执行完一条命令,再执行下一条命令,管道符是将上一条命令的结果传递给下一条命令,并会为这两条命令建立子进程,避免在管道府中使用内建命令,如cd,pwd。
1.2匿名管道(管道符)是Shell编程经常用到的通信工具。
1.3管道符是"|",将前一个命令执行的结果传递给后面的命令,可多个程序连用。如ps | cat
,echo 123 | ps
。
2.子进程与子shell
Chapter6 重定向符号
重定向符号
1.一个进程默认会打开标准输入、标准输出、错误输出三个文件描述符。
2.输入重定向符号"<"
read var < /path/to/a/file
3.输出重定向符号 ">" ">>" "2>" "&>"
echo 123 > /path/to/a/file
>
会把文件里的内容清空,再输入到新的文件,>>
会把当前内容保持不变,然后在下一行进行追加。2>
错误重定向,如果当前命令产生了错误,会把错误重定向到文件中,而不会打印到屏幕。&>
无论内容正确还是错误都会把文件输出到文件中。
举例:
输入重定向
usage:
命令 < file
#加入输入重定向,对输入文件进行计数
wc -l < /etc/passwd
#查看变量内容
echo $变量名
输出重定向
echo $var2 > b.txt #使用'>'会将原来b.txt里面的内容清空再添加进新内容。'>>'为追加重定向,会在原文件的基础上,再添加新内容。
4.输入和输出重定向组合使用
cat > /path/to/a/file << EOF
I am $USER
EOF
结束脚本
举例:
vim 3.sh
#!/bin/bash
cat > /root/a.sh <
Chapter7 变量赋值
1.变量的定义
1.1变量名的命名规则
1.1.1 有意义的字母,数字,下划线
1.1.2 不以数字开头(硬性规则)
2.变量的赋值
2.1 为变量赋值的过程,称为变量替换。
2.1.1变量名=变量值,如a=123
。赋值时等号左右两侧不允许出现空格,若有空格,则空格前面的内容会被当成命令。
2.1.2使用let为变量赋值,如 let a=10+20
2.1.3将命令赋值给变量(不常用),如l=ls
2.1.4将命令结果赋值给变量(常用,为系统节约资源),使用$()
或''
,如letc=$(ls -l/etc)
,cmd1='ls /root'
举例:
#将命令的结果赋给bash
cmd1='ls /root'
cmd2=$(ls /root)
2.1.5变量值有空格等特殊字符可以包含在""或''中。
string1="hello bash" #双引号里面嵌套单引号或单引号里面嵌套双引号。
echo $string1