文章目录
Linux基础传送门:
- Linux基础—1.Linux系统(CentOS6.7)详细安装过程
- Linux基础—2.Linux中的文件基本命令以及四大远程连接工具XShell、FileZilla、Notepad++、Xmanager4的使用
- Linux基础—3.Linux基础命令总结【有图有真相】
- Linux基础—4.Linux系统管理命令【由图有真相】
- Linux基础—5.Shell基础编程【有图有真相】
1.什么是Shell程序?
- 以文件形式存放批量的Linux命令集合,该文件能够被Shell解释执行,这种文件就是Shell脚本程序。
- 通常由一段Linux命令、Shell命令、控制语句以及注释语句构成
- Shell脚本的编写。
Shell脚本是纯文本文件,可以使用任何文本编辑器编写Shell脚本,通常是以.sh 作为后缀名。
2. Shell编程中变量的声明、引用及作用域
-
Shell程序的第一行:用来指定用哪个程序来编译和执行脚本。
#!/bin/bash
或者#!/bin/sh
,sh是bash程序的软连接。这里的#不是注释,是特殊命令。 -
变量命名
变量名必须以字母或下划线开头,后面可以跟字母、数字或下划线。任何其它字符都标志变量名的结束。变量名关于大小写敏感。通过$符号来引用变量名。
-
变量类型
根据变量的作用域,变量可以分为本地变量和环境变量。而环境变量又分root用户的环境变量与某个用户的环境变量。root用户的环境变量设置在/etc/profile
文件下,某个用户的环境变量设置在/home/swpu/.bash_profile
文件中。[swpu@centos ~]$ ll -al total 28 drwx------. 2 swpu swpu 4096 May 18 22:26 . drwxr-xr-x. 3 root root 4096 May 18 20:44 .. -rw-------. 1 swpu swpu 51 May 18 21:11 .bash_history -rw-r--r--. 1 swpu swpu 18 Mar 23 2017 .bash_logout -rw-r--r--. 1 swpu swpu 176 Mar 23 2017 .bash_profile -rw-r--r--. 1 swpu swpu 124 Mar 23 2017 .bashrc -rw-rw-r-- 1 swpu swpu 0 May 18 22:26 dis.sh -rw-rw-r-- 1 swpu swpu 240 May 18 21:36 lj-log.txt [swpu@centos ~]$ vi .bash_profile # .bash_profile # Get the aliases and functions if [ -f ~/.bashrc ]; then . ~/.bashrc fi # User specific environment and startup programs PATH=$PATH:$HOME/bin export PATH # 添加用户环境变量 export NAME_TEST=liujie
保存后;
[swpu@centos ~]$ source .bash_profile [swpu@centos ~]$ echo $NAME_TEST liujie
本地变量只在创建它们的 shell程序中可用。而环境变量则在Shell中的所有用户进程中可用,通常也称为全局变量。 -
变量赋值
等号两边不能有空格
如果要给变量赋空值,可以在等号后面跟一个换行符 -
显示变量的值的命令:
echo $variable
或者echo ${variable}
-
清除变量的值的命令:
unset variable
-
显示当前用户的所有变量命令:
set
-
环境变量称为全局变量,按照惯例,需要大写:
export LANG
注意:可被所有的Shell环境下访问;
如果父Shell进程产生了子Shell进程,则环境变量可被“继承”并复制
3.Shell编程中位置参量使用和命令执行状态码
-
位置参量
位置参量是一组特殊的内置变量,通常被shell脚本用来从命令行接受参数,或被函数用来保存传递给它的参数。
执行shell脚本时,用户可以通过命令行向脚本传递信息,跟在脚本名后面的用空格隔开的每个字符串都称为位置参量。
位置参量有空格,需要用引号引起来!!!在脚本中使用这些参数时,需通过位置参量来引用。例如:$1表示第一个参数,$2表示第二个参数,以此类推.
$9
以后需要用花括号把数字括起来,如第10个位置参量以${10}
的方式来访问。位置参量列表如下:
下面展示一下位置参量的使用!!![swpu@centos ~]$ mkdir script [swpu@centos ~]$ cd script/ [swpu@centos script]$ ls [swpu@centos script]$ touch test.sh [swpu@centos script]$ vi test.sh
在Notepad++中编写并保存
然后,赋予脚本执行权限
[swpu@centos script]$ chmod u+x test.sh [swpu@centos script]$ ll total 4 -rwxrw-r-- 1 swpu swpu 32 May 18 23:28 test.sh
最后,执行脚本
[swpu@centos script]$ sh test.sh Hello Shell
在脚本中使用位置参数,
[swpu@centos script]$ ./test.sh liujie liuyang tanhaotian Hello liujie - liuyang - tanhaotian !!! [swpu@centos script]$ sh test.sh liujie liuyang tanhaotian Hello liujie - liuyang - tanhaotian !!!
继续在脚本中使用位置参数,
[swpu@centos script]$ ./test.sh liujie liuyang tanhaotian Hello liujie - liuyang - tanhaotian !!! ====================== ./test.sh [swpu@centos script]$ sh test.sh liujie liuyang tanhaotian Hello liujie - liuyang - tanhaotian !!! ====================== test.sh [swpu@centos script]$ . test.sh liujie liuyang tanhaotian Hello liujie - liuyang - tanhaotian !!! ====================== -bash
我们可以发现,不同的执行脚本方式,所使用的脚本不同。 增加显示位置参量个数的位置参量
```python [swpu@centos script]$ sh test.sh Hello - - !!! ====================== test.sh 0 [swpu@centos script]$ sh test.sh liujie liuyang tanhaotian Hello liujie - liuyang - tanhaotian !!! ====================== test.sh 3 ``` 单字符串显示所有位置参量
[swpu@centos script]$ sh test.sh liujie liuyang tanhaotian Hello liujie - liuyang - tanhaotian !!! ====================== test.sh ====================== 3 ====================== liujie liuyang tanhaotian
`#?`显示前面一个命令退出的状态码,0表示没有错误,其他任何值都表示有错误!
[swpu@centos script]$ cd test -bash: cd: test: No such file or directory [swpu@centos script]$ echo $? 1
[swpu@centos script]$ sh test.sh Hello - - !!! ====================== test.sh ====================== 0 ====================== [swpu@centos script]$ echo $? 0
-
命令执行状态码
任何命令进行时都将返回一个退出状态。应用中通常会在关键步骤后判定#?
,已确定关键步骤的执行是否正常。尤其调度系统里需要监控sh返回码。shell脚本的返回码取决于最后一个命令的返回码!退出状态0成功,无错误。
退出状态大于0,失败,某处有错误。查看命令执行状态码命令:
echo $?
4.Shell编程中数组、data和cal命令
4.1 数组
数组的定义:
[swpu@centos ~]$ arr=(zhangsan lisi wangwu)
引用数组中的变量:
[swpu@centos ~]$ echo ${arr[0]}
zhangsan
引用数组中的个数:
[swpu@centos ~]$ echo ${#arr[*]}
3
引用数组中所有元素:
[swpu@centos ~]$ echo ${arr[*]}
zhangsan lisi wangwu
为数组赋值:
[swpu@centos ~]$ arr[0]=liujie
[swpu@centos ~]$ echo ${arr[*]}
liujie lisi wangwu
4.2 date指令
查看Linux系统的时间:
[swpu@centos ~]$ date
Wed May 19 01:59:49 CST 2021
date指令的格式化输出功能:
[swpu@centos ~]$ date +%Y/%m/%d
2021/05/19
[swpu@centos ~]$ date +%H:%M
02:01
[swpu@centos ~]$ date +%H:%M:%S
02:02:50
[swpu@centos ~]$ date +%Y/%m/%dT%H:%M:%S
2021/05/19T02:04:03
[swpu@centos script]$ sh test.sh
2021/05/19T02:13:03
2021/05/18T02:13:03
2021/05/20T02:13:03
4.3 cal指令
查看当前月份的日历:
[swpu@centos script]$ cal
May 2021
Su Mo Tu We Th Fr Sa
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
查看某一年的日历:
[swpu@centos script]$ cal 2021
2021
January February March
Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
1 2 1 2 3 4 5 6 1 2 3 4 5 6
3 4 5 6 7 8 9 7 8 9 10 11 12 13 7 8 9 10 11 12 13
10 11 12 13 14 15 16 14 15 16 17 18 19 20 14 15 16 17 18 19 20
17 18 19 20 21 22 23 21 22 23 24 25 26 27 21 22 23 24 25 26 27
24 25 26 27 28 29 30 28 28 29 30 31
31
April May June
Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
1 2 3 1 1 2 3 4 5
4 5 6 7 8 9 10 2 3 4 5 6 7 8 6 7 8 9 10 11 12
11 12 13 14 15 16 17 9 10 11 12 13 14 15 13 14 15 16 17 18 19
18 19 20 21 22 23 24 16 17 18 19 20 21 22 20 21 22 23 24 25 26
25 26 27 28 29 30 23 24 25 26 27 28 29 27 28 29 30
30 31
July August September
Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
1 2 3 1 2 3 4 5 6 7 1 2 3 4
4 5 6 7 8 9 10 8 9 10 11 12 13 14 5 6 7 8 9 10 11
11 12 13 14 15 16 17 15 16 17 18 19 20 21 12 13 14 15 16 17 18
18 19 20 21 22 23 24 22 23 24 25 26 27 28 19 20 21 22 23 24 25
25 26 27 28 29 30 31 29 30 31 26 27 28 29 30
October November December
Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
1 2 1 2 3 4 5 6 1 2 3 4
3 4 5 6 7 8 9 7 8 9 10 11 12 13 5 6 7 8 9 10 11
10 11 12 13 14 15 16 14 15 16 17 18 19 20 12 13 14 15 16 17 18
17 18 19 20 21 22 23 21 22 23 24 25 26 27 19 20 21 22 23 24 25
24 25 26 27 28 29 30 28 29 30 26 27 28 29 30 31
31
查看某一年某一月的日历:cal [month] [year]
[swpu@centos script]$ cal 5 2021
May 2021
Su Mo Tu We Th Fr Sa
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
5. Shell编程中判断表达式以及if语句使用
5.1 判断表达式
-
关于某个文件的【文件类型】判断,如
test -e filename
表示存在否-e
:查看该文件是否存在?
-f
:查看该文件是否存在且为文件?
-d
:查看该文件是否存在且为目录? -
关于文件的权限判断,如
test -r filename
表示是否具有可读权限-r
:查看该文件是否存在且具有【可读】权限?
-w
:查看该文件是否存在且具有【可写】权限?
-x
:查看该文件是否存在且具有【可执行】权限? -
判断两个整数之间的关系,例如
test n1 -eq n2
-eq
:两数值相等
-ne
:两数值不等
-gt
:n1大于n2
-lt
:n1小于n2
-ge
:n1大于等于n2
-le
:n1小于等于n2 -
判断字符串数据
test -z string
:表示判断字符串是否为空?若string为空字符串,则为true
test -n string
:表示字符串是否为非空?若string为空字符串,则为false
test str1=str2
:判断str1是否等于str2,若相等,则回传true
test str1 != str2
判断str1是否不等于str2,若相等,则回传false -
利用判断符号中括号来进行数据判断
如果要在bash 的语法当中使用中括号作为 shell的判断式时,必须要注意中括号的两端需要有空格符来分隔[swpu@centos script]$ [ -z "$swpu" ];echo "====" ====
5.2 if判断语句
-
一重判断
if[条件判断式];then 当条件判断式成立时,可以进行的指令工作内容; fi<==将if反过来写,就成为fi啦!结束if之意!
如果有多个条件要进行判断时,一种方法是将多个条件写入到一个中括号;另一个方法是用多个中括号,括号与括号之间以
&&
或||
来隔开。&&
代表AND||
代表OR
-
多重、复杂条件判断
在同一个数据的判断中,如果该数据需要进行多种不同的判断时,应该怎么作?# —个条件判断,分成功进行与失败进行(else) if [条件判断式]; then 当条件判断式成立时,可以进行的指令工作内容方 else 当条件判断式不成立时,可以进行的指令工作内容; fi
#多个条件判断(lif... elif ... elif ... else)分多种不同情况执行 if[条件判断式一; then 当条件判断式一成立时,可以进行的指令工作内容; elif[条件判断式二; then 当条件判断式二成立时,可以进行的指令工作内容; else 当条件判断式一与二均不成立时,可以进行的指令工作内容; fi
6.Shell编程中的for循环、while循环
6.1 for循环
for var in con1 con2 con3 ...
do
程序段
done
以上面的例子来说,这个Svar的变量内容在循环工作时:
1.第一次循环时,$var
的内容为con1 ;
2.第二次循环时,$var
的内容为con2 ;
3.第三次循环时,$var
的内容为con3 ;
4…
执行这个脚本时,
[swpu@centos script]$ sh test.sh
liujie
liuyang
tanhaotian
[swpu@centos script]$ sh test.sh
liujie
liuyang
tanhaotian
------------------
45
6.2 while循环
while的中文是当…时,所以,这种方式说的是当condition条件成立时,就进行循环,直到condition 的条件不成立才停止的意思。
while [ condition ] <==中括号内的状态就是判断式
do <==do是循环的开始!
程序段落
done <==done是循环的结束
下面脚本可以实现:从文件或命令中逐行读取
cat filename | while read line
do
echo $line
done
如果对您有帮助,麻烦点赞关注,这真的对我很重要!!!如果需要互关,请评论或者私信!