构建基本脚本
使用多个命令
一次使用多个命令,把它们放在一行,使用’;'隔开
[root@myserver ~]# date ; who; ls
Sun May 14 23:39:34 CST 2023
root pts/0 2023-05-14 23:31 (192.168.10.1)
anaconda-ks.cfg initial-setup-ks.cfg
创建shell脚本
创建shell脚本,必须在文件第一行指定要使用的shell:
#!/bin/bash
编写一个简单的脚本,第一行#!告诉shell使用哪里的shell来运行脚本,后面的#都是起注释作用
#创建一个临时目录用于测试
[root@myserver ~]# mkdir tmp
[root@myserver ~]# cd tmp
[root@myserver tmp]# vi tmp.sh
[root@myserver tmp]# cat tmp.sh
#!/bin/bash
date
who
ls
现在运行一下
[root@myserver tmp]# tmp.sh
bash: tmp.sh: command not found...
shell是通过PATH环境变量来查找命令,查看PATH环境变量
[root@myserver tmp]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
PATH变量被设置成只在一组目录中查找命令。要让shell找到tmp脚本,两种做法:
-
shell脚本所在目录添加到PATH环境变量中
-
在提示符中使用绝对或相对文件路径引用shell脚本
使用单点操作符
[root@myserver tmp]# ./tmp.sh
-bash: ./tmp.sh: Permission denied
访问被拒绝,赋予文件执行权限
[root@myserver tmp]# ll
total 4
-rw-r--r--. 1 root root 24 May 14 23:47 tmp.sh
[root@myserver tmp]# chmod u+x tmp.
[root@myserver tmp]# ./tmp.sh
Mon May 15 00:06:10 CST 2023
root pts/0 2023-05-14 23:31 (192.168.10.1)
tmp.sh
sh
显示消息
#一般输出字符不需要加引号,但如果出现单引号就需要双引号进行界定
[root@myserver tmp]# echo hello shell
hello shell
[root@myserver tmp]# echo let's see if this'll work
lets see if thisll work
[root@myserver tmp]# echo "let's see if this'll work"
let's see if this'll work
可以将echo语句添加到shell脚本中去,显示额外信息:
[root@myserver tmp]# cat tmp.sh
#!/bin/bash
echo The time and date are:
date
echo Who logged into the system:
who
echo Files in the current folder:
ls
[root@myserver tmp]# ./tmp.sh
The time and date are:
Mon May 15 00:18:26 CST 2023
Who logged into the system:
root pts/0 2023-05-14 23:31 (192.168.10.1)
Files in the current folder:
tmp.sh
如果想把文本字符串和命令输出在同一行,使用echo
[root@myserver tmp]# cat tmp.sh
#!/bin/bash
echo -n The time and date are:
date
echo Who logged into the system:
who
echo Files in the current folder:
ls
[root@myserver tmp]# ./tmp.sh
The time and date are:Mon May 15 00:26:57 CST 2023
Who logged into the system:
root pts/0 2023-05-14 23:31 (192.168.10.1)
Files in the current folder:
tmp.sh
变量
环境变量
shell维护一组环境变量,用于记录特定系统信息。
set显示完整环境变量:
set
在脚本中可以使用’$'来使用这些环境变量
[root@myserver tmp]# cat test
#!/bin/bash
echo user info : $USER
echo uid : $UID
echo home : $HOME
[root@myserver tmp]# ./test
user info : root
uid : 0
home : /root
显示美元符号
[root@myserver tmp]# echo $15
5
[root@myserver tmp]# echo \$15
$15
用户变量
用户变量由用户定义,长度不超过20个,区分大小写
[root@myserver tmp]# cat test
#!/bin/bash
a=10
echo a val : $a
b=15
echo b val : $b
[root@myserver tmp]# ./test
a val : 10
b val : 15
退出脚本
Linux提供了专门的变量$?来保存上一个已执行命令的退出状态码
[root@myserver ~]# echo $?
0
[root@myserver ~]# abcd
bash: abcd: command not found...
[root@myserver ~]# echo $?
127
默认情况下,shell脚本会以脚本中最后一个命令的推出状态码推出
[root@myserver tmp]# cat test
#!/bin/bash
echo $(date)
[root@myserver tmp]# ./test
Mon May 15 13:27:30 CST 2023
[root@myserver tmp]# echo $?
0
状态码:
你可以改变这种默认,返回你自己的退出状态码
[root@myserver tmp]# cat test
#!/bin/bash
a=10
b=20
c=$[$a+$b]
exit $c
[root@myserver tmp]# ./test
[root@myserver tmp]# echo $?
30
当你设置状态码大于255时,shell就会模256余数
[root@myserver tmp]# cat test
#!/bin/bash
a=100
b=200
c=$[$a+$b]
exit $c
[root@myserver tmp]# ./test
[root@myserver tmp]# echo $?
44