第一个shell程序 其实我们在交互式环境里敲的命令直接放到一个文本文件里,一个简单的shell程序就完成了 [root@localhost shell]# vim hello.sh [root@localhost shell]# cat hello.sh #!/bin/bash #第一个she
第一个shell程序
其实我们在交互式环境里敲的命令直接放到一个文本文件里,一个简单的shell程序就完成了
[root@localhost shell]# vim hello.sh
[root@localhost shell]# cat hello.sh
#!/bin/bash
#第一个shell小程序
echo "hello world!"
解释
1、第一行表示我们选择使用的shell解释器是bash,也可以用 :#!/usr/bin/env bash
shell的第一行比较特殊,一般都会以#!开始来指定使用的shell解释的类型。
在linux中,除了bash shell以外,还有很多版本的shell, 例如zsh、dash等等...
不过bash shell还是我们使用最多的。
2、第二行以#符号开始,表示本行是注释,注释是对代码的解释说明,注释的内容不会执行,对关键代码加注释是一种好的编程习惯
3、第三行中的echo是linux中的输出命令,该行的意思很明显的就是输出hello world!
二 运行shell脚本程序
shell程序通常会被称为脚本程序,因为shell属于解释型语言,而我们采用解释型语言编写的代码文件通常都会被称之为脚本程序
编写好shell脚本之后,想要运行,首选
运行它有几种方式
方式一:切换到shell脚本所在的目录(此时,称为工作目录)执行shell脚本,该方式需要事先赋予当前用户对该文件的执行权限以及读权限(因为解释执行的本质就是读文件内的代码来执行)
[root@localhost shell]# cd /home/egon/shell/
[root@localhost shell]# chmod +x hello.sh
[root@localhost shell]# chmod +r hello.sh
[root@localhost shell]# ll hello.sh
-rwxr-xr-x. 1 root root 60 8月 14 18:33 hello.sh
[root@localhost shell]# ./hello.sh
hello world!
./的意思是说在当前的工作目录下执行hello.sh
此时采用的就是hello.sh文件头指定的解释器来解释执行文件内代码
方式二:以绝对路径的方式去执行shell脚本,该方式同样需要事先赋予当前用户对该文件的执行权限和读权限
[root@localhost ~]# chmod +x /home/egon/shell/hello.sh
[root@localhost ~]# chmod +r /home/egon/shell/hello.sh
[root@localhost ~]# /home/egon/shell/hello.sh
hello world!
此时采用的仍然是hello.sh文件头指定的解释器来解释执行文件内代码
方式三:直接在终端指定解释器来解释执行脚本,该方式下当前用户对解释器有执行权限即可(默认就是有的),对脚本文件只需要有一个读权限即可
[root@localhost shell]# su - egon
上一次登录:五 8月 14 18:46:34 CST 2020pts/0 上
[egon@localhost ~]$ cd /home/egon/shell/
[egon@localhost shell]$ ll hello.sh # 当前用户egon对脚本没有执行权限
-rw-r--r--. 1 root root 60 8月 14 18:33 hello.sh
[egon@localhost shell]$ sh hello.sh # sh就是一个指向
hello world!
此时采用的是我们指定的解释器来解释执行文件代码,甚至都不用写shell文件中的第一行(指定bash路径)。因为方法三是将hello.sh作为参数传给sh(bash)命令来执行的。这时不是hello.sh自己来执行,而是被解释器来解释执行,所以不要对脚本文件有执行权限也在情理之中,但解释器要读文件内容来解释执行,所以当前用户对脚本文件还是应该有读权限的
ps:
[egon@localhost shell]$ ll /bin/sh # sh本质就是一个指向bash的软连接
lrwxrwxrwx. 1 root root 4 7月 14 03:33 /bin/sh -> bash
方式四:在当前的shell环境中,使用当前的shell解释器执行bash shell脚本,该方式下也是一样,当前用户对脚本文件只需要有一个读权限即可
上述三种方式都是在当前shell环境下开启了一个新的shell解释器环境/子shell来执行程序,脚本程序在子shell中运行完毕后,子shell环境随即关闭,然后返回到父级shell即当前shell环境中,如果就想在当前shell环境中执行,需要这么做
[egon@localhost shell]$ cd /home/egon/shell/
[egon@localhost shell]$ ll hello.sh # 当前用户egon对该文件没有执行权限
-rw-r--r--. 1 root root 60 8月 14 18:33 hello.sh
# 下面两种方式都一样
[egon@localhost shell]$ . hello.sh
hello world!
[egon@localhost shell]$ source hello.sh
hello world!
此时采用的解释器就是当前的shell解释器
在当前shell中执行脚本与在子shell中执行脚本的区别在于作用域,后续我们会详细介绍
# 一个shell环境就是一个单独的全局作用域,不同的shell环境,无法访问彼此shell环境中的变量
[egon@localhost ~]$ x=111
[egon@localhost ~]$ cat /home/egon/shell/hello.sh
#!/bin/bash
echo "hello world!"
echo $x # 我们在这里访问一下全局变量x
[egon@localhost ~]$ source /home/egon/shell/hello.sh # 在当前shell环境执行,可以访问到x
hello world!
111 # 取到了x的值
[egon@localhost ~]$ bash /home/egon/shell/hello.sh # 在子shell环境执行,不能访问到x
hello world!
# 此处打印空
三 调试shell程序
调试方式1:以调试的方式运行
[root@egon test]# sh -vx login.sh
调试方式2:只调试语法是否有问题
[root@egon test]# sh -n login.sh
调试方式3:仅调试脚本的一部分,用set -x与set +x包含
[root@egon test]# cat login.sh
#!/usr/bin/env bash
set -x
read -p "请输入您的名字: " name
read -p "请输入您的密码: " pwd
set +x
if [[ "$name" == "egon" && "$pwd" == "123" ]];then
echo "登录成功"
else
echo "账号或密码错误"
fi
[root@egon test]# . login.sh
四 shell编写规范与建议
一 脚本编写规范
1、脚本存放目录需要统一
2、shell脚本的结尾以.sh
3、脚本开头要有解释器如#!/bin/bash 或者 #!/usr/bin/env bash
4、脚本开头注意加时间、作者、联系邮箱、脚本作用等信息
# Author egon 2020-8-30 version 1 des:xxxxx
5、关键代码应该用#号加上注释
二 代码编写好习惯
1、成对的符号尽量一次性写出来,防止遗漏
例如大括号{},中括号[],小括号(),单引号’’,双引号””,反引号``等
2、括号的保留空格习惯
中括号[ ]两端需要留有空格,不然会报错。书写时即可留出空格然后书写内容。如果不知道大括号{},中括号[],小括号(),到底哪种括号需要两端留空格,可以在书写这些括号的时候两端都保留空格来进行书写,这样可以有效避免因空格导致的各种错误。
3、流程控制语句一次性书写完再添加内容
例1:if语句格式一次书写完成
if 条件内容
then
条件成立后执行的代码
fi
例2:for循环格式一次书写完成
for条件内容
do
条件成立后执行的代码
done
提示:while、until、case等语句也是一样
4、代码缩进提高可读性
ok,简单了解完shell程序的编写、执行、调试之后,就让我们开始学习这门编程语言的语法吧!!!
(责任编辑:中博IT教育)