shell 本质上是 linux 命令,一条一条命令组合在一起,实现某一个目的,
就变成了shell脚本。它从一定程度上 减轻了工作量,提高了工作效率。
Shell通过提示您输入,向操作系统解释该输入,然后处理来自操作系统的任何结果输出,
简单来说Shell就是一个用户跟操作系统之间的一个命令解释器。
shell 编程有哪些注意事项
。shell 命名: Shell脚本名称命名一般为英文、大写、小写,后缀以.sh结尾
。不能使用特殊符号、空格
。见闻之意,名称要写的一眼可以看出功能
。shell 编程 首行需要 #/bin/bash 开头
。shell 脚本变量不能以 数字、特殊符号开头,可以使用下划线一,但不能用破折号
1.第一个shell程序
1.创建一个shell脚本
[root@VM-12-14-centos ~]# touch Helloword.sh
[root@VM-12-14-centos ~]# ll
total 52
-rw-r--r-- 1 root root 773 Aug 11 2022 centos7.sh
-rw-r--r-- 1 root root 1781 Apr 8 2021 cosfs.sh
-rw-r--r-- 1 root root 1237 Jan 28 2021 dnspod.sh
-rw-r--r-- 1 root root 0 Oct 8 23:52 Helloword.sh
-rw-r--r-- 1 root root 30239 Aug 11 2022 install_panel.sh
-rw-r--r-- 1 root root 2258 Mar 3 2021 install.sh
-rw-r--r-- 1 root root 1219 Feb 5 2021 txcdn.sh
2.编辑shell
[root@VM-12-14-centos ~]# vim Helloword.sh
echo "hello world"
~
~
~
echo是Shell的一个内部指令,用于在屏幕上打印出指定的字符串。
3.获取执行权限
[root@VM-12-14-centos ~]# chmod o+x Helloword.sh
[root@VM-12-14-centos ~]# ll
total 56
-rw-r--r-- 1 root root 773 Aug 11 2022 centos7.sh
-rw-r--r-- 1 root root 1781 Apr 8 2021 cosfs.sh
-rw-r--r-- 1 root root 1237 Jan 28 2021 dnspod.sh
-rw-r--r-x 1 root root 19 Oct 9 00:01 Helloword.sh
-rw-r--r-- 1 root root 30239 Aug 11 2022 install_panel.sh
-rw-r--r-- 1 root root 2258 Mar 3 2021 install.sh
-rw-r--r-- 1 root root 1219 Feb 5 2021 txcdn.sh
4.执行shell脚本
[root@VM-12-14-centos ~]# ./Helloword.sh
hello world
2.shell的系统变量介绍
什么是变量
很多人可能会说,可以变化的量就是变量。但是发现很多汉语意思很强大,你看的懂的字,却不一定可以理解它的意思。这里你可以理解为 a = 1,同时还可以 a =2、a = 3 ,不同的值都可以复制给同一个变量 a 。
常见的3种变量
Shell编程中变量分为三种,分别是系统变量、环境变量和用户变量,Shell变量名在定义时,首个字符必须为字母(a-z,A-Z),不能以数字开头,中间不能有空格,可以使用下划线(_),不能使用(-),也不能使用标点符号等。
输出方式
输出时使用单引号,会将单引号中的内容完整的输出。
[root@VM-12-14-centos ~]# test=erlang
[root@VM-12-14-centos ~]# echo '$test'
$test
输出时使用双引号,则会将变量test的值erlang进行输出
[root@VM-12-14-centos ~]# echo "$test"
erlang
没引号,也会将变量test的值erlang进行输出
[root@VM-12-14-centos ~]# echo $test
erlang
增加变量
如果需要增加变量的值,那么可以进行变量值的拼接。
不过变量需要用双引号包含"$变量名"或用${变量名}包含变量名。
[root@VM-12-14-centos ~]# test="$test"dsa
[root@VM-12-14-centos ~]# echo $test
erlangdsa
变量的查看
set [选项]
-u:如果设定此选项,调用未声明变量时会报错(默认无任何提示)
默认
[root@VM-12-14-centos ~]# echo $sdadw
[root@VM-12-14-centos ~]#
执行set -u
[root@VM-12-14-centos ~]# set -u
[root@VM-12-14-centos ~]# echo $sdadw
bash: sdadw: unbound variable
取消set +u
[root@VM-12-14-centos ~]# set +u
[root@VM-12-14-centos ~]# echo $sdadw
[root@VM-12-14-centos ~]#
-x:如果设定此选项,在命令执行之前,会把命令先输出一次
[root@VM-12-14-centos ~]# set -x
++ history -a
++ printf '\033]0;%s@%s:%s\007' root VM-12-14-centos '~'
[root@VM-12-14-centos ~]# echo $test
+ echo erlangdsa
erlangdsa
++ history -a
++ printf '\033]0;%s@%s:%s\007' root VM-12-14-centos '~'
+<参数> :取消某个set曾启动的参数。
直接使用set 命令,会查询系统中所有的变量,包含用户自定义变量和环境变量
位置变量
$n :n为数字,$0表示当前 Shell 脚本程序的名称,$1-$9表示第一个到第九个参数,10以后的需要用大括号{}。
测试,计算两数之和
在下列执行过程中,1是第一个参数,12是第二个参数,此shell脚本中将第一个参数和第二个参数求和。
Sum.sh
expr $1+$2 |bc
执行
[root@VM-12-14-centos ~]# ./Sum.sh 1 1
2
[root@VM-12-14-centos ~]# ./Sum.sh 1 12
13
$*:这个变量代表命令行中所有的参数
$# :这个变量代表命令行中所有参数的个数
Sum.sh
expr "参数1:$1"
expr "参数2:$2"
expr "所有参数:$*"
expr "参数个数:$#"
[root@VM-12-14-centos ~]# ./Sum.sh 1 12
参数1:1
参数2:12
所有参数:1 12
参数个数:2
预定义变量:
$? :最后一次执行的命令的返回状态
[root@VM-12-14-centos ~]# $?
bash: 0: command not found
[root@VM-12-14-centos ~]# echo $?
127
[root@VM-12-14-centos ~]# echo $?
0
上一次执行Sum.sh成功,所以输出$? 返回的是0,当$? 这个变量为0,则表示上一个命令执行命令执行正确,当这个变量不为0的其他数,则表示上一个命令执行出现问题。
$$:表示当前进程的进程号Pid
[root@VM-12-14-centos ~]# echo $$
31892
可以通过ps -f 查看当前的进程
[root@VM-12-14-centos ~]# ps -f
UID PID PPID C STIME TTY TIME CMD
root 20021 31892 0 01:15 pts/0 00:00:00 ps -f
root 31892 1322 0 Oct08 pts/0 00:00:00 bash --login
算数运算符:
加法
[root@VM-12-14-centos ~]# echo `expr 15 + 1`
16
减法
[root@VM-12-14-centos ~]# echo `expr 15 - 1`
14
乘法
[root@VM-12-14-centos ~]# echo `expr 15 \* 2`
30
除法
[root@VM-12-14-centos ~]# echo `expr 15 / 2`
7
取余
[root@VM-12-14-centos ~]# echo `expr 15 % 2`
1
关系运算符:
-eq检测两个数是否相等,相等返回 true。[ $a -eq $b ] 返回 false。
[root@VM-12-14-centos ~]# [ $a -eq $b ]
[root@VM-12-14-centos ~]# echo $?
1
-ne检测两个数是否不相等,不相等返回 true。[ $a -ne $b ] 返回 true。
[root@VM-12-14-centos ~]# [ $a -ne $b ]
[root@VM-12-14-centos ~]# echo $?
0
-gt检测左边的数是否大于右边的,如果是,则返回 true。[ $a -gt $b ] 返回 false。
[root@VM-12-14-centos ~]# [ $a -gt $b ]
[root@VM-12-14-centos ~]# echo $?
1
-lt检测左边的数是否小于右边的,如果是,则返回 true。[ $a -lt $b ] 返回 true。
[root@VM-12-14-centos ~]# [ $a -lt $b ]
[root@VM-12-14-centos ~]# echo $?
0
-ge检测左边的数是否大于等于右边的,如果是,则返回 true。[ $a -ge $b ] 返回 false。
[root@VM-12-14-centos ~]# [ $a -ge $b ]
[root@VM-12-14-centos ~]# echo $?
1
-le检测左边的数是否小于等于右边的,如果是,则返回 true。[ $a -le $b ] 返回 true。
[root@VM-12-14-centos ~]# [ $a -le $b ]
[root@VM-12-14-centos ~]# echo $?
0