1. 简述
- 工作目录执行
- 绝对路径执行
- sh执行
- shell环境执行
2. 工作目录执行
其实就是进入到脚本所在的文件夹 然后使用 ./ 执行脚本,但是注意要权限,不然会报错,
[root@Centos-root473791 ~]# ./9*9.sh
-bash: ./9*9.sh: Permission denied
[root@Centos-root473791 ~]# chmod a+x 9*9.sh
[root@Centos-root473791 ~]# ./9*9.sh
1*1=1
2*1=2 2*2=4
3*1=3 3*2=6 3*3=9
4*1=4 4*2=8 4*3=12 4*4=16
5*1=5 5*2=10 5*3=15 5*4=20 5*5=25
6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36
7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49
8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64
9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81
[root@Centos-root473791 ~]#
99乘法脚本如下
#! /bin/bash
a=1
b=1
while ((a<=9))
do
while ((b<=a))
do
let "c=a*b"
echo -n "$a*$b=$c "
let b++
done
let a++
let b=1 #因为每个乘法表都是1开始乘,所以b要重置
echo ""
done
3. 绝对路径执行
其实就是从根目录 / 到脚本所在的目录 执行脚本,跟工作目录其实差不多一回事,也需要权限
[root@Centos-root473791 ~]# `pwd`/9*9.sh
1*1=1
2*1=2 2*2=4
3*1=3 3*2=6 3*3=9
4*1=4 4*2=8 4*3=12 4*4=16
5*1=5 5*2=10 5*3=15 5*4=20 5*5=25
6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36
7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49
8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64
9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81
4. sh执行
sh执行,指的是用脚本对应的sh或bash来接着脚本执行,换句话说,简单理解就是 别人来调用你执行,而不是你自己执行,也就不需要执行权限和知道路径了,反正是别人来找你,官方点就是将hello.sh作为参数传给sh(bash)命令来执行的。这时不是hello.sh自己来执行,而是被人家调用执行,所以不要执行权限和 指定bash路径。
5. shell环境执行
就是在当前shell环境中执行,可以使用点 . 或者source 接脚本执行
如果不理解会出现一些坑,建议使用sh执行
如下
开始有 9*9.sh脚本,后面我改名为99.sh,再次执行还是会出现结果,这就很神奇,
明明不存在该脚本了,但是还可以执行,这就是所谓的环境执行
[root@Centos-root473791 ~]# ll
total 72
-rw-r--r-- 1 root root 720 Jan 22 21:10 1.sh
-rw-r--r-- 1 root root 1057 Jan 22 21:29 2.sh
-rw-r--r-- 1 root root 13 Jan 22 22:13 3.sh
-rwxr-xr-x 1 root root 234 Nov 23 12:00 99.sh
drwxr-xr-x 2 root root 4096 Dec 5 01:25 aaaa
-rw-------. 1 root root 1524 Aug 22 07:39 anaconda-ks.cfg
-rw-r--r-- 1 root root 62 Nov 27 23:50 awkscript
-rw-r--r-- 1 root root 22 Nov 27 23:41 awk.txt
-rw-r--r--. 1 root root 27338 Aug 22 07:39 install.log
-rw-r--r--. 1 root root 7572 Aug 22 07:38 install.log.syslog
[root@Centos-root473791 ~]# . 9*9.sh
1*1=1
2*1=2 2*2=4
3*1=3 3*2=6 3*3=9
4*1=4 4*2=8 4*3=12 4*4=16
5*1=5 5*2=10 5*3=15 5*4=20 5*5=25
6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36
7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49
8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64
9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81
[root@Centos-root473791 ~]#
6. 总结区别
- 1.绝对路径和相对路径没有什么区别,两种方式都需要提前赋予脚本以执行权限。
- 2.sh或者bash方式是把脚本当做bash的调用来处理,所以,脚本不需要有执行权限就可以执行。
- 3.前三种方式都是在当前shell中打开一个子shell来执行脚本内容,当脚本内容结束,则子shell关闭,回到父shell中。
- 4.source或者.方式是使脚本内容在当前shell里执行,而不是单独开子shell执行。
开子shell与不开子shell的区别就在于,环境变量的继承关系,如在子shell中设置的当前变量,不做特殊通道处理的话,父shell是不可见的。而在当前shell中执行的话,则所有设置的环境变量都是直接生效可用的。
7. 重点(别踩坑)
source是Shell(准确地说是Bash)的内置命令,在Bourne Shell中的等价命令是一个点.,即点命令。用source命令执行脚本文件时,是在当前Shell进程中执行,而不是像./与sh方式一样在新的Shell进程中执行,因此早先设置的变量在脚本里是可以读取到的。
source一般不用来执行业务脚本,最常见用途是在某些初始化脚本修改之后使其立即生效,即source /etc/profile这样。