2.1、脚本格式
脚本以#!/bin/bash
开头(指定解析器)
2.2、第一个Shell脚本:helloworld.sh
(1) 需求: 创建一个 Shell 脚本, 输出 helloworld
(2) 过程如下
step1:创建helloworld.sh
文件,内容如下 vi helloworld.sh
#!/bin/bash
echo "helloworld"
step2:运行helloworld.sh
文件,命令如下
[root@jenkins ~]# chmod +x helloworld.sh
[root@jenkins ~]# ./helloworld.sh
helloworld
2.3、脚本的执行方式
上面我们使用的是./helloworld.sh
来执行helloworld.sh
脚本,其实执行shell脚本文件有很多方式,下面来看下。
2.3.1、第1种:采用bash或sh+脚本的绝对路径或相对路径(不用赋予脚本+x权限)
(1)sh+脚本的相对路径
[root@jenkins ~]# pwd
/root
[root@jenkins ~]# sh ./helloworld.sh
helloworld
[root@jenkins ~]#
(2)sh+绝对路径
[root@jenkins ~]# sh /root/helloworld.sh
helloworld
[root@jenkins ~]#
(3)bash+脚本的相对路径或者是相对路径
[root@jenkins ~]# bash ./helloworld.sh
helloworld
[root@jenkins ~]# bash /root/helloworld.sh
helloworld
[root@jenkins ~]#
2.3.2、第2种: 采用输入脚本的绝对路径或相对路径执行脚本(必须具有可执行权限+x)
[root@jenkins ~]# ./helloworld.sh
helloworld
[root@jenkins ~]# /root/helloworld.sh
helloworld
[root@jenkins ~]#
注意:
第一种执行方法,本质是bash解析器帮你执行脚本,所以脚本本身不需要执行权限;第二种执行方法,本质是脚本需要自己执行,所以需要执行权限。
2.3.3、第3种:在脚本的路径前加上”.”或者source
[root@jenkins ~]# . helloworld.sh
helloworld
[root@jenkins ~]# source helloworld.sh
helloworld
[root@jenkins ~]#
2.4、父子shell
当我们使用ssh连接工具登录linux以后,出来了一个黑屏界面,如下,就开启了一个shell进程
[root@jenkins ~]#
可以使用ps -f查看到到当前的shell进程,如下,使用是bash
[root@jenkins ~]# ps -f
UID PID PPID C STIME TTY TIME CMD
root 1833 1829 0 13:02 pts/0 00:00:00 -bash
root 1903 1833 0 13:21 pts/0 00:00:00 ps -f
shell可以一层层嵌套,在当前shell中可以使用bash命令开启一个子shell,子shell中还可以继续执行bash命令再次打开一个子shell,多层级父子shell
[root@jenkins ~]# ps -f
UID PID PPID C STIME TTY TIME CMD
root 1833 1829 0 13:02 pts/0 00:00:00 -bash
root 1903 1833 0 13:21 pts/0 00:00:00 ps -f
[root@jenkins ~]# bash
[root@jenkins ~]# ps -f
UID PID PPID C STIME TTY TIME CMD
root 1833 1829 0 13:02 pts/0 00:00:00 -bash
root 1910 1833 0 13:41 pts/0 00:00:00 bash
root 1921 1910 0 13:41 pts/0 00:00:00 ps -f
[root@jenkins ~]# bash
[root@jenkins ~]# ps -f
UID PID PPID C STIME TTY TIME CMD
root 1833 1829 0 13:02 pts/0 00:00:00 -bash
root 1910 1833 0 13:41 pts/0 00:00:00 bash
root 1922 1910 0 13:41 pts/0 00:00:00 bash
root 1933 1922 0 13:41 pts/0 00:00:00 ps -f
[root@jenkins ~]#
使用exit可以一层层从里面的shell中向外退出,现在有3层shell,如果需要退出登录,则需要执行3次exit,如下
[root@jenkins ~]# exit
exit
[root@jenkins ~]# ps -f
UID PID PPID C STIME TTY TIME CMD
root 1833 1829 0 13:02 pts/0 00:00:00 -bash
root 1910 1833 0 13:41 pts/0 00:00:00 bash
root 1936 1910 0 13:43 pts/0 00:00:00 ps -f
[root@jenkins ~]# exit
exit
[root@jenkins ~]# ps -f
UID PID PPID C STIME TTY TIME CMD
root 1833 1829 0 13:02 pts/0 00:00:00 -bash
root 1937 1833 0 13:44 pts/0 00:00:00 ps -f
[root@jenkins ~]# exit
logout
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Session stopped
- Press <return> to exit tab
- Press R to restart session
- Press S to save terminal output to file
2.5、执行shell脚本的几种方式的区别
刚刚上面介绍了执行shell脚本有3种方式
- 第1种:bash 脚本文件或者sh 脚本文件
- 第2中:采用输入脚本的绝对路径或相对路径执行脚本(必须具有可执行权限+x)
- 第3中:. 脚本文件或source 脚本文件
前2种方式都是在当前 shell 中打开一个子 shell 来执行脚本内容, 当脚本内容结束, 则子 shell 关闭, 回到父 shell 中。
第3种, 也就是使用在脚本路径前加“.” 或者 source 的方式, 可以使脚本内容在当前 shell 里执行, 而无需打开子 shell。
子shell中无法访问父shell中定义的变量,如果需要访问,则需在父shell中,通过export 变量名将变量提升为全局环境变量,这样内层的shell才可以访问到外层shell中的环境变量,这也是为什么我们每次要修改完/etc/profile 文件以后, 需要 source 一下的原因。