1.shell基本知识
1.1shell程序的特点
-
简单易学
-
解释性语言,不需要编译即可执行
查看当前系统支持的shell
[root@localhost ~]# chsh -l /bin/sh /bin/bash /usr/bin/sh /usr/bin/bash /usr/bin/tmux /bin/tmux /usr/bin/zsh /bin/zsh [root@localhost ~]# cat /etc/shells /bin/sh /bin/bash /usr/bin/sh /usr/bin/bash /usr/bin/tmux /bin/tmux /usr/bin/zsh /bin/zsh
查看当前用户使用的shell解释器,当前系统的默认shell
[root@localhost ~]# echo $SHELL /bin/bash
通过 -s 参数改变当前的shell设置
[root@localhost ~]# chsh -s /bin/zsh
1.2shell的功能
Shell又称命令解释器,它能识别用户输入的各种命令,并传递给操作系统。它的作用类似于Windows操作系统中的命令行,但是,Shell的功能远比命令行强大的多。在UNIX或者localhost中,Shell既是用户交互的界面,也是控制系统的脚本语言。
1.3学好shell编程基础知识
-
熟练使用vi(vim)编辑器
-
熟练掌握Linux基本命令
-
熟练掌握文本三剑客工具(grep、sed、awk)
-
熟悉常用服务器部署、优化、日志及排错
1.4shell变量
1.4.1shell变量的命名规则
变量名和等号之间不能有空格,变量名的命名须遵循如下规则:
-
命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
-
中间不能有空格,可以使用下划线 _。
-
不能使用标点符号。
-
不能使用bash里的关键字(可用help命令查看保留关键字)。
什么是驼峰语法?
骆驼式命名法就是当变量名或函数名是由一个或多个单词连结在一起,而构成的唯一识别字时,第一个单词以小写字母开始;从第二个单词开始以后的每个单词的首字母都采用大写字母,例如:
myFirstName、myLastName,这样的变量名看上去就像骆驼峰一样此起彼伏,故得名。
1.4.2使用变量
使用一个定义过的变量,只要在变量名前面加美元符号($)即可,变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,例如:
your_name="wu" echo $your_name echo ${your_name}
已定义的变量,可以被重新定义,如:
your_name="tom" echo $your_name your_name="alibaba" echo $your_name
1.5 shell脚本的基本元素
对于一个基本的Shell程序来说,应该拥有以下基本元素:
-
声明:声明用哪个命令解释器来解释并执行当前脚本文件中的语句,一般写的解释器为(#!/bin/bash) 。
-
命令:可执行语句,实现程序的功能。
-
注释:说明某些代码的功能,通过在代码中增加注释可以提高程序的可读性。
-
赋予rx的权限(chmod a+rx)
单行注释:#开头的一整行都是注释
#comment1 #comment2 #comment3
多行注释,使用冒号“:”配合here document可实现多行注释,例如:
:<<BLOCK //BLOCK可以被替换 ……注释内容 BLOCK
1.6脚本编写规范
(1)脚本文件名应见名知意,例如backup_mysql.sh(linux的扩展名对文件类型没有任何影响,只是为了让用户知道)
(2)文件开头指定脚本解释器 #!/bin/sh 或 #!/bin/bash
(3)开头加版本特权等信息
# Date:创建日期 # Author:作者 # Mail:联系方式 # Function:功能 # Version:版本
(4)脚本中尽量不要用中文注释
-
尽量用英文注释,防止本机或切换系统环境后中文乱码的困扰;
-
单行注释,可以放在代码行的尾部或代码行的上部;
-
多行注释,用于注解复杂的功能说明,可以放在程序体中,也可以放在代码块的开始部分。
(5)没有必要使用cat命令
eg:cat /etc/passwd | grep guru 使用以下方式即可 eg:grep guru etc/passwd
(6)代码缩进,虽然不缩进不会报错
#!/bin/bash i=1 //定义变量,赋值 while [ $i -le 10 ] //$i引用变量;-le,less echo,小于等于10 do if [ $i -le 9 ] //如果小于等于9,则username=user0$i then username=user0$i else username=user$i0 //如果不小于等于9,则username=user$i0 //!非,id $username判断用户是否存在,如果存在返回0值,!0则为假则不执行{}内的;如果不存在返回1,!1为真则执行{}添加账号并修改密码(&&前面为真就执行后面,前面为假则不执行后面) fi ! id $username &>/dev/null && { useradd $username echo $username | passwd --stdin $username &>/dev/null } let i++ //i自增 done //&>/dev/null:将输出定向到黑洞,不在屏幕输出
(7)多使用内部命令,内部命令在目录列表时是看不见的,它们由Shell本身提供
常用的内部命令有:echo、eval、exec、export、read、shift、exit
echo可在屏幕上输出信息
-
-n 不换行输出内容,echo 命令输出结束后默认会换行,如果不希望换行,可以加上
\n
参数
[root@localhost ~]# echo tset tset [root@localhost ~]# echo -n tset tset[root@localhost ~]#
-
-e 解析转义字符,默认情况下,echo 不会解析以反斜杠
\
开头的转义字符。比如,\n
表示换行,echo 默认会将它作为普通字符对待-
\n 换行
[root@localhost ~]# echo test\ntest testntest \n [root@localhost ~]# echo -e "test\ntest" test test [root@localhost ~]# echo -e test\\ntest 前一个\会让后一个\失效变成普通的\ test test
-
\r 回车,光标移至行首,但不换行,相当于使用“\r”以后的数字覆盖之前相等长度的字符
\r [root@localhost ~]# echo -e 1234\\rabcd abcd [root@localhost ~]# echo -e 12345\\rabcd abcd5 [root@localhost ~]# echo -e 1234\\rabcde abcde
-
\t 制表符
\t [root@localhost ~]# echo -e 1234\\tabcde 1234 abcde
-
\b 退格,但前提是“\b”后存在字符
\b [root@localhost ~]# echo -e test\\bwu teswu [root@localhost ~]# echo -e "test\bwu" teswu
-
\v 纵向制表符,换行,但是换行后的新行的开头位置连接着上一行的行尾
\v [root@localhost ~]# echo -e 1234\\vabcde\\v5678\\v90qw 1234 abcde 5678 90qw
-
eval
命令格式:eval args
功能:当shell程序执行到eval语句时,shell读入参数args,并将它们组合成一个新的命令,然后执行。
[root@localhost test]# a='shuju;head -1 /etc/passwd' [root@localhost test]# echo $a shuju;head -1 /etc/passwd [root@localhost test]# eval echo $a shuju root:x:0:0:root:/root:/bin/bash
exec命令能够在不创建新的子进程的前提下,转去执行指定的命令,当指定的命令执行完毕后,该进程就终止了。
[root@localhost ~]# ps -ef //查看进程 [root@localhost ~]# vim file //创建一个文件,