14.1 shell编程:脚本编程基础
编译器,解释器:将汇编语言或者是高级语言转换为机器语言的翻译设备或软件
编程语言:机器语言、汇编语言、高级语言(符合人类的思考模式,而且能通过编译器转换为机器语言)
14.1.1 编程语言分类
1、高级语言分类
(1)静态语言:编译型语言
强类型(变量类型)
事先转换成可执行格式(不需要解释器就能执行)
C、C++、JAVA、C#
(2)动态语言:解释型语言, on the fly
弱类型语言
边解释边执行(必须要解释器才能正常执行)
PHP、SHELL、python、perl
2、根据执行情况分类
面向过程(着眼点再解决问题本身):Shell, C
面向对象(着眼点在于一个一个的对象): JAVA, Python, perl, C++
变量:内存空间,命名,可以不断地更新内容
内存:编址的存储单元
进程:将数据临时放于内存当中
1+100:
1+1000000
1
14.1.2 bash:
1、保存类型:
(1)字符
(2)数值
(a)整型
(b)浮点型: 11.23, 1.123*10^1, 0.1123*10^2
2013/10/10, 存为字符串格式需要64bit
99999: 存为数字格式需要24bit,
(3)真、假
整型,8bit,保存256的话会发生溢出,导致部分程序运行不正常,称之为是缓冲区溢出
逻辑运算
逻辑:1+1>2
逻辑运算:与、或、非、异或
1: 真
0: 假
与
1 & 0 = 0
0 & 1 = 0
0 & 0 = 0
1 & 1 = 1
或:
非:
! 真 = 假
! 假 = 真
异或
操作数相同为假,不同则为真
14.2 变量及变量操作
shell: 弱类型编程语言
14.2.1 变量类型:
强:变量在使用前,必须事先声明,甚至还需要初始化;
弱:变量用时声明,甚至不区分类型;(一般默认为字符串)
变量类型:事先确定数据的存储格式和长度
变量赋值:VAR_NAME=VALUE
1、bash变量类型:
环境变量:作用域为当前shell进程及其子进程;
export VARNAME=VALUE
VARNAME=VALUE
export VARNAME
“导出”
本地变量(局部变量):set VARNAME=VALUE: 作用域为整个bash进程;(set可省略)
引用变量:${VARNAME} (会造成混淆时使用{}),{}有时可省略
局部变量:local VARNAME=VALUE:作用域为当前代码段;
位置变量:$1, $2, ...
特殊变量(系统变量):用于保存一些特殊数据
$?: 上一个命令的执行状态返回值;
程序执行,可能有两类返回值:
(1)程序执行结果
(2)程序状态返回代码(0-255)
0: 正确执行
1-255:错误执行,1,2,127系统预留;其他的返回值可以自己定义
[root@Daniel-R480 ~]# clear
[root@Daniel-R480 ~]# echo $?
0
[root@Daniel-R480 ~]# ll
total 16
-rw------- 1 root root 6921 Jan 29 2019 anaconda-ks.cfg
-rw-r--r-- 1 root root 0 Jun 7 10:55 cut
-rw-r--r-- 1 root root 0 Jun 7 09:47 hellosa
-rwx------ 1 apache root 513 Jun 4 11:52 inittab
-rw------- 1 root root 6577 Jan 29 2019 original-ks.cfg
-rw-r--r-- 1 root root 15 Jun 7 10:53 passwd.txt
-rw-r--r-- 1 root root 91 Jun 7 13:43 test2.txt
-rw-r--r-- 1 root root 12 Jun 7 14:43 test3.txt
-rw-r--r-- 1 root root 46 Jun 7 11:49 test.txt
[root@Daniel-R480 ~]# echo $?
0
[root@Daniel-R480 ~]# ld
ld: no input files
[root@Daniel-R480 ~]# echo $?
1
[root@Daniel-R480 ~]#
[root@Daniel-R480 ~]# id student &> /dev/null
[root@Daniel-R480 ~]# echo $?
1
dev/null: 软件设备(模拟的不存在的设备), bit bucket,数据黑洞(会吞掉所有接受到的数据)
echo $?,可用来判断用户是否存在
输出重定向:
>,>>,2>,2>>,&>
撤消变量:
unset VARNAME
查看当shell中变量:
set
查看当前shell中的环境变量:
printenv
env
export
[root@Daniel-R480 ~]# ANIMALS=PIG
[root@Daniel-R480 ~]# ANIMALS=$ANIMALS:GOAT
[root@Daniel-R480 ~]# echo $ANIMALS
PIG:GOAT
[root@Daniel-R480 ~]# ANIMALS=$ANIMALS:SHEEP
[root@Daniel-R480 ~]# echo $ANIMALS
PIG:GOAT:SHEEP
shell默认不进行数据的运算
14.3 BASH脚本
脚本:命令的堆砌,按实际需要,结合命令流程控制机制实现的源程序
1、shebang: 魔数(每个脚本的第一行)
#!/bin/bash(#!+脚本的解释路径)
# 注释行,不执行(正文里面的#作用)
[root@Daniel-R480 ~]# vim first.sh
[root@Daniel-R480 ~]#
[root@Daniel-R480 ~]# file /bin/ls
/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=ceaf496f3aec08afced234f4f36330d3d13a657b, stripped
[root@Daniel-R480 ~]# file first.sh
first.sh: ASCII text
[root@Daniel-R480 ~]# vim first.sh
[root@Daniel-R480 ~]# file first.sh
first.sh: Bourne-Again shell script, ASCII text executable
[root@Daniel-R480 ~]# ll first.sh
-rw-r--r-- 1 root root 35 Jun 7 17:44 first.sh
[root@Daniel-R480 ~]# chmod +x first.sh
[root@Daniel-R480 ~]# ./first.sh
#
# /etc/fstab
# Created by anaconda on Mon Jan 28 20:51:49 2019
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=f41e390f-835b-4223-a9bb-9b45984ddf8d / xfs defaults 0 0
adm crash empty gopher lib lock mail opt run tmp yp
cache db games kerberos local log nis preserve spool var.out
[root@Daniel-R480 ~]#
[root@Daniel-R480 ~]# chmod -x first.sh
[root@Daniel-R480 ~]# ll
total 16
-rw------- 1 root root 6921 Jan 29 2019 anaconda-ks.cfg
-rw-r--r-- 1 root root 0 Jun 7 10:55 cut
-rw-r--r-- 1 root root 35 Jun 7 17:44 first.sh
-rw-r--r-- 1 root root 0 Jun 7 09:47 hellosa
-rwx------ 1 apache root 513 Jun 4 11:52 inittab
-rw------- 1 root root 6577 Jan 29 2019 original-ks.cfg
-rw-r--r-- 1 root root 15 Jun 7 10:53 passwd.txt
-rw-r--r-- 1 root root 91 Jun 7 13:43 test2.txt
-rw-r--r-- 1 root root 12 Jun 7 14:43 test3.txt
-rw-r--r-- 1 root root 46 Jun 7 11:49 test.txt
[root@Daniel-R480 ~]# bash first.sh
#
# /etc/fstab
# Created by anaconda on Mon Jan 28 20:51:49 2019
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=f41e390f-835b-4223-a9bb-9b45984ddf8d / xfs defaults 0 0
adm crash empty gopher lib lock mail opt run tmp yp
cache db games kerberos local log nis preserve spool var.out
[root@Daniel-R480 ~]#
2、脚本和环境关系
脚本在执行时会启动一个子shell进程;
命令行中启动的脚本会继承当前shell环境变量;
系统自动执行的脚本(非命令行启动)就需要自我定义需要各环境变量;
练习:
写一个脚本,完成以下任务
1、添加5个用户, user1,..., user5
2、每个用户的密码同用户名,而且要求,添加密码完成后不显示passwd命令的执行结果信息;
3、每个用户添加完成后,都要显示用户某某已经成功添加;
#!/bin/bash
#
useradd user1
echo !$ | passwd --stdin &>/dev/null
echo "Add user1 successfully!"
useradd user2
echo !$ | passwd --stdin &>/dev/null
echo "Add user2 successfully!"
useradd user3
echo !$ | passwd --stdin &>/dev/null
echo "Add user3 successfully!"
useradd user4
echo !$ | passwd --stdin &>/dev/null
echo "Add user4 successfully!"
useradd user5
echo !$ | passwd --stdin &>/dev/null
echo "Add user5 successfully!"
[root@Daniel-R480 ~]# ./aduser.sh
Add user1 successfully!
Add user2 successfully!
Add user3 successfully!
Add user4 successfully!
Add user5 successfully!
[root@Daniel-R480 ~]# tail -5 /etc/passwd
user1:x:4008:4008::/home/user1:/bin/bash
user2:x:4009:4009::/home/user2:/bin/bash
user3:x:4010:4010::/home/user3:/bin/bash
user4:x:4011:4011::/home/user4:/bin/bash
user5:x:4012:4012::/home/user5:/bin/bash
[root@Daniel-R480 ~]#
Comments Closed.