shell编程规范与变量
一、概述:解释器,编译器,翻译官。
1.定义:
(1)给要执行的命令安顺序保存到一个文本文件。
(2)给文本可执行权限。
(3)可结合各种shell控制语句以完成各种复杂操作。
2.作用:
(1)与内核进行沟通的界面,应用程序。
(2)把代码翻译成二进制,给内核进行处理。
(3)shell是一个特殊的应用程序,介于操作系统和用户之间,扮演的是命令解释器的角色。
(4)运行:用户输入操作指令,由shell解释。再传递给内核,内核执行完返回shell,给用户一个执行结果。
-
shell:(1)脚本语言:按行执行,按顺序执行。
(2)动态语言:编程语言的一种,用来控制软件应用程序,通常以文本形式保存,只在被调用时,才进行解释或编译。
3.应用场景:
(1)重复性操作
(2)交互性任务
(3)批量事务处理
(4)服务运行状态监控
(5)定时任务执行
4.登录:
用户默认登录shell为/bin/bash。
5.shell脚本基本格式:
(1)编写:
vim first.sh #编写shell脚本
#! /bin/bash #这里是脚本声明即解释器,表示以下代码由/bin/bash来翻译执行
# this is my first shell #描述脚本做什么
cd /boot
echo "当前目录位于:"
pwd
echo "其中以vml开头的文件包括:" #可执行语句,表示脚本具体的内容
ls -lh vml*
~
(2)运行:
(3)脚本运行方式:
运行方式 | 权限 | 执行方式 |
---|---|---|
sh | 不需要给执行权限 | 在调试阶段,可以不赋权执行(运行) |
bash | 不需要给执行权限 | 在调试阶段,可以不赋权执行(运行) |
source | 不需要给执行权限 | 在调试阶段,可以不赋权执行(相当于从内核编译,全量执行) |
./ | 必须给执行权限 | 在正式上线时,必须赋权执行 |
二、重定向与管道操作:
1.交互式硬件设备:
默认设备 | 文件编号 | 使用 | |
---|---|---|---|
标准输入 | 键盘 | 0 | 读取执行过程中需要的输入数据 |
标准输出 | 显示器 | 1 | 命令执行后的输出结果发送到标准输出文件 |
标准错误输出 | 显示器 | 2 | 执行期间各种错误信息发送到标准错误 文件 |
2.重定向操作:
类型 | 操作符 | 用途 |
---|---|---|
重定向输入 | < | 从制定文件输入内容,而不从键盘输入 |
重定向输出 | > | 将输出结果保存到指定文件(覆盖原有内容) |
>> | 将输出结果追加到指定文件尾部 | |
重定向错误输出 | 2> | 将错误信息保存到指定文件(覆盖原有内容) |
2>> | 将错误信息追加到指定文件中 | |
混合输出 | &> | 将标准输出,标准错误的内容保存到同一文件中 |
思考:如何在不删除文件的情况下,清空文件内容?
cat /dev/null > passwd.txt
3.管道符:
(1)作用:把管道符左侧命令的输出结果作为右侧命令的处理对象。
(2)格式:命令 选项 | 命令 选项
三、shell变量的作用和类型:
1.作用:用来存放系统和用户需要使用的特定参数(值)。
(1)变量名:使用固定的名称,由系统预设或用户定义。
变量名的使用规范:
1.不使用系统自带的命令作变量名。
2.不使用中文
3.不使用特殊符号开头,_可以作开头。
4.要用注释。
(2)变量值:能够根据用户设置,系统环境的变化而变化。
(3)强引用和弱引用:赋值变量时,单引号和双引号无区别。打印变量时,双引号是弱引用,是变量原本的值。单引号是强引用,就不是原变量的值,变成变量本身,字符串。
双引号:允许通过$符号引用其他变量值
单引号:禁止引用其他变量值,$视为普通字符
反撇号:命令替换,提取命令执行后的输出结果,
…
和$(…)作用相同
2.类型介绍:
(1)自定义变量:由用户自己定义,修改,删除。
(2)特殊变量:环境变量,只读变量,位置变量,预定义变量。
(3)变量范围:
类型 | 释义 |
---|---|
整数 | int |
字符串 | string |
布尔 | 真假,0或1 |
浮点 | 1.1 2.2 |
3.整数变量的运算:
(1)格式:格式:expr 变量1 运算符 变量2
[root@localhost ~]# expr 1 + 2 (加法)
3[root@localhost ~]# expr 2 - 1 (减法)
1[root@localhost ~]# expr 2 * 3 (乘法)
6
[root@localhost ~]# expr 2 / 1 (除法)
2
[root@localhost ~]# expr 5 % 2 (取余数)
1
(2)常用运算法则:
i++ 相当于 i= ( ( (( ((i+1)) for i=1 i<=10 i++ i=10 i=9 i=9 i=8 i=7 i=6
i-- 相当于 i= ( ( (( ((i-1)) i=10 10-1=9 i=9 9-1=8 i=8
i+=2 相当于 i= ( ( (( ((i+2))
i++ 是先赋值再加1 i=1+1
++i 是加后再赋值1 1+1=2 2+1=3
(3)bc计算器:(既可以支持整数,又支持浮点计算)
[root@localhost ~]# echo 52 | bc
10
[root@localhost ~]# echo 5/2 | bc
2
[root@localhost ~]# echo "scale=2;4.32.4" | bc scale:内部自带全局变量,定义小数点后的位数。
10.32
4.设置变量的作用范围:
(1)格式:
export 变量名
export 变量名=变量值
(2)实操:
[root@localhost ~]# export bk=10
[root@localhost ~]# export pp=20
[root@localhost ~]# vim test.sh
c=$(($bk+$pp))
echo $c
:wq!
[root@localhost ~]# sh test.sh
30
5.全局变量:
(1)定义:所有shell环境都可以使用,所有用户自定义变量在于shell中都可以使用。
(2)全局变量的优点:
1.全局范围: 全局变量在整个程序或脚本的各个部分都是可见和可访问的。
2.持久性: 全局变量的生命周期与程序的执行时间相同。它们在程序启动时创建,在程序结束时销毁。
3.共享性: 全局变量可以在程序的不同函数或方法之间共享数据。这样,多个函数可以使用和修改相同的全局变量。
(3)全局变量潜在的副作用:可能导致副作用和潜在的复杂性。
1.因为全局变量是可访问的,所以它们可以被任何函数修改。
2.这可能导致程序状态的不确定性和难以调试的问题。
(4)实操:
[root@localhost ~]# export winwin=9
[root@localhost ~]# export ningning=3
[root@localhost ~]# vim test.sh
c=$(($winwin+$ningning))
echo $c
:wq!
多打开一个终端:
[root@localhost ~]# vim /etc/profile
底行:
export ningning=3
export winwin=9
:wq!
[root@localhost ~]# source /etc/profile
[root@localhost ~]# sh test.sh
12
6.特殊变量应用:
(1)只读变量:不可以删除,重启后删除。
[root@localhost ~]# readonly a
[root@localhost ~]# echo $a
123
[root@localhost ~]# a=456
-bash: a: 只读变量
(2)环境变量:env(配置工作环境,目录)
1.作用:系统自带,用于设置工作环境。配置系统行为,控制程序的执行。环境变量所有用户都可以使用,都可见。
参数 作用 $USER 表示用户名称 $HOME 表示用户的宿主目录 $LANG 表示语言和字符集 $PWD 表示当前所在工作目录 $PATH 表示可执行用户程序的默认路径
(3)位置变量(命令行参数):
1.作用:运行脚本或程序时,传递给他们的值,用于将外部数据传递给脚本执行。
2.当执行命令行操作时,第一个字段表示命令名或脚本程序名,其余的字符串参数按照从左到右的顺序依次赋值给位置变量。
$n:n为数字,$0代表命令本身。
$1- 9 代表带一个到第九个参数,十以上的参数需要使用大括号表示,比如第十个参数为 9代表带一个到第九个参数,十以上的参数需要使用大括号表示,比如第十个参数为 9代表带一个到第九个参数,十以上的参数需要使用大括号表示,比如第十个参数为{10}
[root@localhost ~]# vim test1.sh
num1=$1
num2=$2
sum=$(($num1 + $num2))
echo $sum
:wq!
[root@localhost ~]# sh test1.sh 1 2
3
[root@localhost ~]# sh test1.sh 3 5
8
num1=${1}
num2=${2}
sum=$(($num1+$num2))
echo $sum
[root@localhost ~]# sh test1.sh 10 11
21
(4)预定义变量:
1.定义:通常是编程语言或脚本解释器提供,根据需要自动设置,更新,不能修改。
2.使用:
作用 $* 所有位置参数的内容看成一个整体返回,加双引号后,内容放在一行处理。不加双引号,分行处理。 $@ 输出脚本后的所有位置参数,且认为每个都是独立的,加双引号就是分行处理。 $? 判断上一条命令是否执行成功,成功,返回结果为0。所有非0返回值都是失败。 $0 当前执行的程序或进程名。