4.3 shell使用
shell脚本类似于我们在Windows中编写的批处理文件,它的扩展名是.bat,比如我们启动Tomcat(后面的课程我们会详细讲解)的时候经常启动的startup.bat,就是Windows下的批处理文件。
而在Linux中,shell脚本编写的文件是以.sh结尾的。比如Tomcat下我们经常使用startup.sh来启动我们的Tomcat,这个startup.sh文件就是shell编写的。
4.3.1 shell入门
通过简单的学习,我们编写一个简单的入门shell程序。
我们通过前面学习的echo命令,在shell脚本中打印出一句话。
1) 什么是shell
Shell 脚本(shell script),是一种为 shell 编写的脚本程序。
Shell 脚本(Shell Script)又称 Shell 命令稿、程序化脚本,是一种计算机程序使用的文本文件,内容由一连串的 shell 命令组成,经由 Unix Shell 直译其内容后运作
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K0YpDx3C-1620310526845)(assets/1576838959401.png)]
Shell 被当成是一种脚本语言来设计,其运作方式与解释型语言相当,由 Unix shell 扮演命令行解释器的角色,在读取 shell 脚本之后,依序运行其中的 shell 命令,之后输出结果。利用 shell 脚本可以进行系统管理,文件操作等。
在 Unix 及所有的系统中,如 Linux、FreeBSD 等操作系统,都存在 shell 脚本。依照 Unix shell 的各种不同类型,shell 脚本也有各种不同方言。在 DOS、OS/2、Microsoft Windows 中的批处理文件,跟 shell 脚本有类似的功能。
2) shell环境
java需要虚拟机解释器, 同理 shell脚本也需要解释器
Shell 编程跟 JavaScript、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。
查看解释器
cat /etc/shells
执行效果如下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Yaz92qn5-1620310526846)(assets/1577068054836.png)]
Linux 的 Shell 种类众多,常见的有:
- Bourne Shell(/usr/bin/sh或/bin/sh)
- Bourne Again Shell(/bin/bash)
- C Shell(/usr/bin/csh)
- K Shell(/usr/bin/ksh)
- Shell for Root(/sbin/sh)
- 等等……
我们当前课程使用的是 Bash,也就是 Bourne Again Shell,由于易用和免费,Bash 在日常工作中被广泛使用。同时,Bash 也是大多数Linux 系统默认的 Shell
3) 编写第一个shell
现在,我们打开文本编辑器(我们也可以使用 vi/vim 命令来创建文件),新建一个文件 czbk.sh,扩展名为 sh(sh代表shell):
#!/bin/bash --- 指定脚本解释器
echo "你好,传智播客 !"
//写shell的习惯 第一行指定解释器
//文件是sh为后缀名
//括号成对书写
//注释的时候尽量不用中文注释。不友好。
//[] 括号两端要要有空格。 [ neirong ]
//习惯代码索引,增加阅读性
//写语句的时候,尽量写全了,比如if。。。
1、创建sh文件**
vim czbk.sh
2、编写并保存
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vLeTI7hX-1620310526846)(assets/1576839380199.png)]
3、查看czbk.sh文件
ls -l
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5RYRHuGL-1620310526847)(assets/1576839550390.png)]
如上图,我们发现刚刚编写的czbk.sh文件的的权限是【-rw-rw-r–】,通过我们之前学过的知识,我们发现这个文件并没有执行的权限
我们需要将czbk.sh文件设置下它的执行权限【x】,如果不设置有执行权限,当前的文件不具备文件执行的能力。
通过chmod设置执行权限
chmod +x ./czbk.sh
执行效果如下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dx8HZbOm-1620310526847)(assets/1576839765609.png)]
我们发现,czbk.sh拥有了【x】执行权限
下面,我们就开始执行czbk.sh
4、执行czbk.sh文件 — bash a.sh0
./czbk.sh
执行效果如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gLiMGA1o-1620310526848)(assets/1576839880567.png)]
如上图,我们刚刚编写的shell在执行的时候正常打印出来了,说明czbk.sh具备执行的能力
注意:
#! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。
echo 命令用于向窗口输出文本。
4.3.2 shell注释
引子:
在Java SE课程中,我们也学习了注释
比如单行注释我们使用双斜杠//
多行注释我们使用/**开头表示注释多行
而在shell编程中,我们同样也要有注释,注释掉程序中不用的脚本
1、单行注释
以 # 开头的行就是注释,会被解释器忽略。
通过每一行加一个 # 号设置多行注释,如下:
#--------------------------------------------
# 这是一个注释
#--------------------------------------------
##### 开始 #####
#
#
# 这里可以添加脚本描述信息
#
#
##### 结束 #####
如果在开发过程中,遇到大段的代码需要临时注释起来,过一会儿又取消注释,怎么办呢?
每一行加个#符号太费力了,此时,我们可以通过EOF进行多行注释,如下:
2、多行注释
多行注释还可以使用以下格式:
:<<EOF
注释内容...
注释内容...
注释内容...
EOF
EOF 也可以使用其他符号:
:<<'
注释内容...
注释内容...
注释内容...
'
:<<!
注释内容...
注释内容...
注释内容...
!
总结:
我们将在下面的小章节中使用注释,查看注释效果
4.3.3 shell变量
引子:
这里的变量我们可以理解为我们在Java SE阶段定义的变量,比如在SE中我定义一个字符串类型的变量使用String stringStr="";
注意:下面的演示我们还是继续沿用test-shell.sh进行测试
1、定义变量:
variable_name="czbk"
变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。同时,变量名的命名须遵循如下规则:
- 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
- 中间不能有空格,可以使用下划线(_)。
- 不能使用标点符号。
- 不能使用bash里的关键字(可用help命令查看保留关键字)。
有效的 Shell 变量名示例如下:
RUNOOB
LD_LIBRARY_PATH
_var
var2
无效的变量命名:
?var=123
user*name=runoob
2、使用变量
使用一个定义过的变量,只要在变量名前面加美元符号即可,如:
variable_name="czbk"
echo $variable_name
echo ${variable_name}
执行效果如下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GqaOBgpH-1620310526849)(assets/1577175492599.png)]
变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况:
echo "I am good at ${shell-t}Script"
通过上面的脚本我们发现,如果不给shell-t变量加花括号,写成echo "I am good at s h e l l − t S c r i p t " , 解 释 器 s h e l l 就 会 把 shell-tScript",解释器shell就会把 shell−tScript",解释器shell就会把shell-tScript当成一个变量,由于我们前面没有定义shell-t变量,那么解释器执行执行的结果自然就为空了。这里我们推荐给所有变量加上花括号,这也是一个好的编程习惯。
已定义的变量,可以被重新定义,如:
your_name="tom"
echo $your_name
your_name="frank"
echo $your_name