四、Shell脚本

什么是shell脚本

我们把原来linux命令或语句放在一个文件中,然后通过这个程序文件去执行时,就被称为shell脚本;

举例

vim test.sh

 内容如下

#!/bin/bash
#This is shell.
ehco "hello world"
mkdir /tmp/test
touch /tmp/test/a.txt

 添加执行权限

chmod +x test.sh

 

脚本执行顺序

1、先查找系统环境变量ENV(该变量指定了环境变量文件,加载顺序默认为/etc/profile,~/.bash_profile、~/bashrc、/etc/bashrc)

2、执行Shell脚本(从上至下,从左至右)

执行脚本时父Shell(也就是当前Shell)会向系统内核请求启动一个新的进程,在该进程中执行脚本命令。

 

 shell脚本的执行通常有以下几种方式

1、/root/test.sh(绝对路径)或者 ./test.sh(需要添加执行权限chmod +x test.sh)

2、bash test.sh 或 sh test.sh  (不需要添加执行权限,会开启新的进程执行脚本,推荐使用)

3、source test.sh 或 . test.sh(不需要添加执行权限,在当前父shell进程中运行,可以将自身脚本中的变量和函数返回到父shell中使用)

4、sh < test.sh 或者 cat test.sh |sh(bash)

 

例3:

这种方式会在父Shell进程中运行,可将shell.sh自身脚本中的变量值或函数的返回值返回到父Shell中使用

[root@tz yum.repos.d]# source shell.sh
[root@tz yum.repos.d]# . shell.sh

举例

使用sh命令执行脚本,输出变量userdir为空

[root@tz yum.repos.d]# echo 'userdir=`pwd`' >pwd.sh
[root@tz yum.repos.d]# sh pwd.sh
[root@tz yum.repos.d]# echo $userdir

使用source命令执行脚本,输出变量userdir不为空,说明值存在当前父shell中

[root@tz yum.repos.d]# source pwd.sh
[root@tz yum.repos.d]# echo $userdir
/etc/yum.repos.d

如果脚本中有引用或执行其他脚本内容或配置文件时,最好使用.或source执行脚本文件

 

命令的替换

Shell脚本可以从命令输出中提取信息并将其赋给变量。

可通过一下两种方式

  • 反引号`
  • $()格式

在命令中调用date命令输出值

命令替换:将命令的执行结果作为echo的输出值

[root@tzPC ~]# echo `date`
Wed Jul 15 10:14:21 CST 2020
[root@tzPC ~]# echo $(date)
Wed Jul 15 10:23:32 CST 2020
[root@tzPC ~]# echo `date +"%Y-%m-%d"`
2020-07-15

常见案例

[root@tzPC Script]# cat test5
#/bin/bash
today=$(date +%y%m%d)
ls -al /usr/bin >log.$today

 

注意命令替换会创建一个子Shell来运行对应的命令

[root@tzPC Script]# echo $BASH_SUBSHELL
0
[root@tzPC Script]# echo `echo $BASH_SUBSHELL`
1

 

$BASH_SUBSHELL参数输出为1表示有子shell

[root@tzPC Script]# `echo $BASH_SUBSHELL >subshell`
[root@tzPC Script]# cat subshell 
1

 

这里有个疑问,父Shell创建普通变量test值为1,命令替换开启子Shell是如何读到父Shell的普通变量test的?

[root@tzPC Script]# test=1
[root@tzPC Script]# `echo $test > test`
[root@tzPC Script]# cat test
1

 

命令的嵌套使用

[root@tzPC ~]# var6=$(tar zcvf root.tar.gz $(find /root/ -name *.cfg))
tar: Removing leading `/' from member names
[root@tzPC ~]# ls
2018-05-12_21:10:44  anaconda-ks.cfg  root.tar.gz

 当本机时间不准确,如晚于文件的mtime时间,解压文件会发生如下报错,解压是成功了的

[root@tzPC ~]# date -s "2012-03-03 21:25:00"
Sat Mar  3 21:25:00 CST 2012
[root@tzPC ~]# tar zxvf root.tar.gz -C /home/tz/
root/anaconda-ks.cfg
tar: root/anaconda-ks.cfg: time stamp 2020-02-04 13:00:19 is 250011303.162389384 s in the future

 输出重定向

将命令的输出发送到一个文件。

[root@tzPC Script]# who >test1
[root@tzPC Script]# cat test1
root     tty1         2020-08-10 16:20

>>为追加

输入重定向

将文件的内容重定向到命令。

[root@tzPC Script]# wc < test1
  5  24 259

wc命令会对数据中的文本计数,默认输出3个值

行数、词数、字节数

内联输入重定向

必须指定一个文本标记来划分输入数据的开始和结尾

[root@tzPC Script]# cat << EOF
> 123
> 321
> EOF
123
321

管道

将一个命令的输出作为另一个命令的输入

[root@tzPC Script]# rpm -qa | sort |more
abrt-2.1.11-55.el7.centos.x86_64
abrt-addon-ccpp-2.1.11-55.el7.centos.x86_64
abrt-addon-kerneloops-2.1.11-55.el7.centos.x86_64
abrt-addon-pstoreoops-2.1.11-55.el7.centos.x86_64
abrt-addon-python-2.1.11-55.el7.centos.x86_64
abrt-addon-vmcore-2.1.11-55.el7.centos.x86_64
...

 

posted @ 2020-08-05 17:36  努力吧阿团  阅读(154)  评论(0编辑  收藏  举报