SHELL编程入门、shell变量、数值运算
日期: 2020-07-03 分类: 个人收藏 483次阅读
1. SHELL编程入门&概念剖析
- 默认Linux操作系统启动之后,使用用户和密码登录,默认会登录到SHELL终端上,用户所有的操作都是在SHELL终端来执行。
- SHELL是基于C语言开发的软件程序,默认是置于Linux内核的外层,默认Linux系统启动之后,会在Linux内核外层,装载一层外壳,这个外壳称为SHELL。
- SHELL外壳程序是位于用户使用者和Linux内核之间的,主要是用于接收用户输入的指令,并且解析命令,最终将解析之后的指令发给Linux内核,Linux内核处理完成之后,会将处理的结果返回给SHELL,SHELL会对Linux内核返回数据做解释(翻译),最终将翻译之后的信息返回给用户。
- SHELL也被称为"命令解释器",是用户和Linux内核之间沟通的桥梁,用户输入最终SHELL解释器都会返回相应数据信息。SHELL充当中间件角色。
2. SHELL解释器软件常见种类:
- Bourne Shell(/usr/bin/sh或/bin/sh)
- Bourne Again Shell(/bin/bash)
- C Shell(/usr/bin/csh)
- K Shell(/usr/bin/ksh)
- Shell for Root(/sbin/sh)
- 不同的Shell语言的语法有所不同,一般不能交换使用,最常用的shell是Bash,也就是Bourne Again Shell。Bash由于易用和免费,在日常工作中被广泛使用,也是大多数Linux操作系统默认的Shell环境。
3. shell编程的概念:
- SHELL编程主要是将手工操作的单个Linux指令或者多个Linux指令,按照一定的逻辑关系和顺序堆积(堆放)在文本文件中,最终文本文件中的所有Linux指令将会以特定的SHELL解释器(/bin/bash)去执行(Linux内核处理),从而完成企业某个具体的功能。
- Shell、Shell编程、Shell脚本、Shell命令之前都有什么区别呢?简单来说Shell是一个整体的概念,Shell编程与Shell脚本统称为Shell编程,Shell命令是Shell编程底层具体的语句和实现方法。
编写及执行脚本:
1.shell脚本编程需要如下几个事项:
- Shell脚本名称命名一般为英文、大写、小写;
- 不能使用特殊符号、空格来命名;
- Shell脚本后缀以.sh结尾;
- 不建议Shell命名为纯数字,一般以脚本功能命名。
- Shell脚本内容首行需以#!/bin/bash开头;
- Shell脚本中变量名称尽量使用大写字母,字母间不能使用“-”,可以使用“_”;
- Shell脚本变量名称不能以数字、特殊符号开头。
2. 第一个脚本:
shell脚本创建“三部曲”
- 新建文本文件
- 添加可执行的脚本语句
- 添加“X”执行权限
#创建存放脚本文件目录:
[root@localhost ~]# mkdir -p /data/sh/2020-07-02/
[root@localhost ~]# cd /data/sh/2020-07-02/
#创建脚本文本文件:
[root@localhost 2020-07-02]# touch hello.sh
#写脚本语句:
[root@localhost 2020-07-02]# vim hello.sh
#!/bin/bash
#2020年7月2日20:01:08
#by author Xiaoyuer
####################################
echo "Hello World"
#添加执行权限:
[root@localhost 2020-07-02]# chmod +x hello.sh
#执行脚本验证:
[root@localhost 2020-07-02]# ./hello.sh
Hello World
########################################
#!脚本声明(使用哪种解释器)
#注释信息(步骤、思路、变量含义、用途等)
shell变量:
1.变量的概念及优点:
概念:以固定名称存放,可能会变化的值。
优点:提高脚本对任务的需求,运行环境变化的适应能力,方便在脚本中重复使用。
2. 定义/赋值/查看变量:
- 变量名称不可以使用数字开头
- 变量名不可以是特殊字符
- 变量名可以为字母、数字、下划线
#定义变量yy,赋值1234
root@localhost 2020-07-02]# yy=1234
#输出变量值:
[root@localhost 2020-07-02]# echo $yy
1234
#变量名易混淆时以{}分开
[root@localhost 2020-07-02]# echo ${yy}6
12346
#取消变量
[root@localhost 2020-07-02]# unset yy
[root@localhost 2020-07-02]# echo $yy
3. 变量的种类:
以shell变量分类的角度分为两大类:
- 存储类型:
- 存储型又分为:整数型、浮点型、双精度浮点型、字符型…
- shell脚本语音对存储类型要求比较松散。
- 使用类型:
类型 | 说明 |
---|---|
环境变量 | 变量名通常是大写,由系统维护,用来设置工作环境,只有个别变量用户可以直接修改 |
位置变量 | bash内置,存储执行脚本时提供的参数 |
预定义变量 | bash内置,一类有特殊用途的变量,可直接调用,但不能直接赋值或修改。 |
自定义变量 | 由用户自主设置、修改及使用 |
环境变量:
- 配置文件:
/etc/profile、~/.bash_profile - 相关操作:
env:列出所有的环境变量
set:列出所有变量 - 常见的环境变量:
PWD、PATH、USER、UID、SHELL、HOME、PS1、PS2…
预定义变量
- 用来保存脚本程序的执行信息
- 可以直接使用这些变量,不能为这些变量赋值
变量名 | 含义 |
---|---|
$0 | 当前所在的进程或脚本名 |
$$ | 当前运行进程的PID号 |
$? | 命令执行后的返回状态,0表示正常,1或其他值表示异常 |
$# | 已加载的位置变量的个数 |
$* | 所有位置变量的值 |
位置变量
- 在执行脚本时提供的命令行参数
[root@localhost 2020-07-02]# vim first.sh
#!/bin/bash
#2020年7月2日20:01:08
#by author Xiaoyuer
####################################
cat $1 ----这里的$1就是位置变量
#输入脚本路径+为$1赋值:这里的意思是查看hello.sh文件内容
[root@localhost 2020-07-02]# ./first.sh hello.sh
#!/bin/bash
#2020年7月2日20:01:08
#by author Xiaoyuer
####################################
echo "Hello World"
4. 扩展赋值操作:
> - 区分三种定界符:
> 1. 双引号" " :允许扩展,以$引用其他变量
> 2. 单引号' ' :禁用扩展,即便$也视为普通字符
> 3. 反撇号` ` :将命令的执行输出作为变量值
例:
[root@localhost 2020-07-02]# echo "当前用户是$USER"
当前用户是root
[root@localhost 2020-07-02]# echo '当前用户是$USER'
当前用户是$USER
[root@localhost 2020-07-02]# yy=pwd
[root@localhost 2020-07-02]# echo $yy
pwd
[root@localhost 2020-07-02]# yy=`pwd`
[root@localhost 2020-07-02]# echo $yy
/data/sh/2020-07-02
提示:$()和``等效,但$()更方便嵌套使用
5. read标准输出取值:
read 从键盘读入变量值完成赋值:
- 格式:read [-p "提示信息”] 变量名
- -p可选,-t可指定超时秒数
终端显示控制:
- stty -echo :关闭终端输出(无显示)
- stty echo :恢复终端输出(显示)
例:
[root@localhost 2020-07-02]# vim add_user.sh
#!/bin/bash
#2020年7月2日20:01:08
#by author Xiaoyuer
####################################
read -p "请输入你要创建的用户:" USER
read -p "请为你创建的用户设置密码:" PASSWD
useradd $USER &>/dev/null
echo "用户创建成功"
echo $PASSWD | passwd --stdin $USER &>/dev/null
echo "密码设置成功"
[root@localhost 2020-07-02]# chmod +x add_user.sh
[root@localhost 2020-07-02]# ./add_user.sh
请输入你要创建的用户:xiaoming
请为你创建的用户设置密码:1234
用户创建成功
密码设置成功
#修改脚本输入密码时无法显示出来:
[root@localhost 2020-07-02]# vim add_user_v2.sh
#!/bin/bash
#2020年7月2日20:01:08
#by author Xiaoyuer
####################################
read -p "请输入你要创建的用户:" USER
stty -echo ----关闭终端输入
read -p "请为你创建的用户设置密码:" PASSWD
stty echo ---恢复终端输入
useradd $USER &>/dev/null
echo
echo "用户创建成功"
echo $PASSWD | passwd --stdin $USER &>/dev/null
echo "密码设置成功"
[root@localhost 2020-07-02]# chmod +x ./add_user_v2.sh
[root@localhost 2020-07-02]# ./add_user_v2.sh
请输入你要创建的用户:sxy
请为你创建的用户设置密码:
用户创建成功
密码设置成功
6.变量的作用范围:
- 局部变量:
- 新定义的变量默认只在当前shell环境中生效
- 无法在子shell环境使用
- 全局变量:
- 全局变量在当前shell及子shell环境中均生效
- 使用export可将局部变量声明为全局变量
export +变量名 ---为局部变量添加全局属性
export -n +变量名 取消指定变量的全局属性
[root@localhost ~]# bb=123
[root@localhost ~]# echo $bb
123
[root@localhost ~]# export "bb"
[root@localhost ~]# sh
sh-4.2# echo $bb
123
[root@localhost ~]# export -n "bb"
[root@localhost ~]# echo $bb
123
[root@localhost ~]# sh
sh-4.2# echo $bb
7. 数值运算:
- 数值运算分为:整数运算和小数运算
7.1. 整数运算:
7.1.1. 基本运算类别:
四则运算:
1. 加法 : num1 + num2
2. 减法 : num1 - num2
3. 乘法 : num1 * num2
4. 整除 : num1 / num2
去余数运算:
- 求模 :num1 % num2
7.1.2. expr运算工具:
- 计算指定的表达式,并输出结果
- 格式:expr 整数1 运算符 整数2 .......
- 乘法操作应采用 \* 转义,避免被作为shell通配符
例:
[root@localhost ~]# expr 2 + 4
6
[root@localhost ~]# expr 4 - 3
1
[root@localhost ~]# expr 2 \* 4
8
[root@localhost ~]# expr 4 / 2
2
[root@localhost ~]# expr 5 % 2 ---这里是取余数,5除以2余1
1
注意:expr和num1之间需要空格,num和运算符之间也需要空格
7.1.3. $[ ]算式替换:
- 使用$[]或$(())表达式
- 格式:$[整数1 运算符 整数2....]
- 乘法操作 * 无需转义,运算符两侧可以无空格。
- 引用变量可省略 $ 符号
- 计算结果替换表达式本身,可结合echo命令输出
例:
[root@localhost ~]# X=30
[root@localhost ~]# echo $[X+20]
50
[root@localhost ~]# echo $((X-20))
10
[root@localhost ~]# echo $X
30
[root@localhost ~]# echo $[X*2]
60
[root@localhost ~]# echo $[X/2]
15
[root@localhost ~]# echo $[X%20]
10
注意以上操作不会改变变量原来的值
7.1.4. 变量自增/自减操作:
- 使用$[ ]替换,或者let命令来完成
- 结合echo命令查看结果
简写表达式 | 完整表达式 |
---|---|
i++ | i=i+1 |
i- - | i=i-1 |
i+=2 | i=i+2 |
i-=2 | i=i-2 |
i*=2 | i=i*2 |
i%=2 | i=i%2 |
[root@localhost ~]# i=20
[root@localhost ~]# echo $[i+=2]
22
[root@localhost ~]# echo $[i*=2]
44
[root@localhost ~]# echo $[i/=2]
22
[root@localhost ~]# echo $[i%=3]
1
[root@localhost ~]# echo $i
1
[root@localhost ~]# let i+=30;echo $i
31
提示:从上面的操作可以看得出来,以上操作可以改变变量i的值
7.2. 小数运算:
7.2.1整数运算的局限性:
- Bash内建机制及支持整数值运算
- expr命令 、$[ ]算式替换不支持有小数运算
[root@localhost ~]# expr 2 + 2.5
expr: 非整数参数
[root@localhost ~]# echo $[2+2.5]
-bash: 2+2.5: 语法错误: 无效的算术运算符 (错误符号是 ".5")
7.2.2. 使用bc实现小数运算:
- 多数Linux系统默认安装此工具
- 假如没有安装这个工具可以输入命令yum -y install bc
- 运行bc可进入交互式运算界面,quit退出
- 设置scale=n可约束小数位
[root@localhost ~]# bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
2.2+2.5
4.7
100/3 ----这里可以看得出来100除以3是无限循环小数但是得出的结果是33
33
scale=4 ---这里约束小数位为4
100/3 ----再次100除以3得出的是33.3333
33.3333
2*6 ---可以看得出来这里也可以整数运算
12
- 结合管道向bc发送表达式
- 多个表达式以 分号分割
- 通过echo命令+管道传递要计算的表达式
[root@localhost ~]# A=12.34
[root@localhost ~]# echo "$A*12.45" |bc
153.63
[root@localhost ~]# B=12.340
[root@localhost ~]# echo "$B*12.45"|bc
153.633
以上操作可以得出以下结论未设置约束小数位时输出结果和变量值的小数位一样
[root@localhost ~]# echo "scale=4;$A*12.45"|bc
153.6330
[root@localhost ~]# echo "scale=4;$A*13.35;4/2"|bc
164.7390
2.0000
7.2.3. 小数值得比较:
基本用法:
- echo “数值1 比较符 数值2" |bc
- 如果表达式成立,则返回的计算结果为1,否则返回0
- 常见的比较符:> 、< 、==、>=、<=、!=
[root@localhost ~]# A=12.34
[root@localhost ~]# B=15.34
#判断12.34小于等于15.34得出的结果是1,代表是正确的
[root@localhost ~]# echo "$A<=$B" |bc
1
#判断12.34等于15.34得出的结果是0代表是不正确的
[root@localhost ~]# echo "$A==$B"|bc
0
[root@localhost ~]# Q=10
[root@localhost ~]# W=20
[root@localhost ~]# echo "$Q==$W"|bc
0
[root@localhost ~]# echo "$Q<=$W"|bc
1
除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog
标签:shell linux
精华推荐