shell编程规范与变量
shell
shell定义
运行于linux系统当中的一种特殊程序。
充当翻译官的角色,用于进行使用者输入的指令翻译成内核可以识别的二进制(进行命令行的解释),进而有内核去调用系统硬件设备。
Linux中有哪些Shell ?
登录后默认使用的Shell程序,一般默认为是:/bin/bash。
且是目前大多数Linux 版本采用的默认Shell。
在不同Shell的内部指令、运行环境等会有所区别
shell程序 | 说明 |
---|---|
bash | 基准于GNU的框架下发展出的Shell |
csh | 语法有点类似于c语言的Shell |
tcsh | 整合了csh,提供更多的功能 |
sh | 已经被bash所替换 |
nologin | 奇怪的shell,这个shel1可以让用户无法登录主机 |
为什么系统上合法的Shell要写入/etc/ shells这个文件呢?
这是因为系统某些服务运行过程中,会去检查用户能够使用的Shell,而这些shell的查询就是借由/etc/shells这个文件。
用户什么时候可以取得shq1l来工作?用户默认会取得哪一个shell?
当用户登录的时候,系统就会给我一个shell让我来用, 而这个登录取得的Shell就记录在/etc/passwd这个文件内
shell 的应用场景
shell脚本是将要执行的命令按顺序保存到一个文本文件,并给该文件可执行权限,方便一次性执行的一个执行文件。
可结合各种Shel控制语句以完成更复杂的操作
常用于:
1.重复性操作
2.交互性任务
3.批量事务处理
4.服务运行状态监控
5.定时任务执行
等
shell脚本的构成
1.脚本申明(解释器) :若第一行为“#! /bin/bash", 表示此行以下的代码语句是通过/bin/bash程序来解释执行,
#!/bin/bash为默认解释器。还有其它类型的解释器,比如#! /usr/bin/python、#!/usr/bin/ expect。
2.注释信息:以“#”开头的语句表示为注释信息,被注释的语句在运行脚本时不会被执行。
3.可执行语句:比如echo命令,用于输出" "之间的字符串
vim first. sh
#! /bin/bash
#This is my first Shell -Script.
cd /opt
echo “当前的目录位于:”
pwd
echo “其中以vml开头的文件包括:”
ls -lh *.sh
shell脚本的执行
方法一
指定路径的命令,要求文件必须有x权限。
chmod +x / root/ first. sh
指定绝对路径: /root/ first. sh
指定相对路径: . / first. sh
方法二
指定Shel1来解释脚本,不要求文件必须有x权限。
sh脚本路径: sh first.sh
source 脚本路径: first.sh或者 source first.sh
管道操作 |
将管道符号“|”左侧的命令输出的结果,作为右侧命令的输入(处理对象),同–行命令中可以使用多个管道。
ps aux| wc -l
echo “abc123” | passwd – stdin sk
重定向
1.标准输入:从该设备接收用户输入的数据
2.标准输出:通过该设备向用户输出的数据
3.标准错误:通过该设备报告执行的出错信息
交互式硬件设备
类型 | 设备文件 | 文件描述编号 | 默认设备 |
---|---|---|---|
标准输入 | /dev/stdin | 0 | 键盘 |
标准输出 | / dev/stdout | 1 | 显示器 |
标准错误输出 | /dev/stderr | 2 | 显示器 |
重定向操作
类型 | 操作符 | 用途 |
---|---|---|
重定向输入 | < | 从指定的文件读取数据 |
重定向输出 | > | 将标准输出结果保存到指定的文件,并且覆盖原有内容 |
>> | 将标准输出结果追加到指定的文件的尾部,不覆盖原有内容 | |
标准错误输出 | 2> | 将错误信息保存到指定的文件,并且覆盖原有内容 |
2>> | 将错误信息追加到指定的文件的尾部,不覆盖原有内容 | |
混合输出 | &> | 将标准输出、标准错误保存到同一文件中 |
2>&1 | 将标准错误输出重定向到标准输出 |
例:
echo “123456” > pass.txt
passwd --stdin sk < pass.txt
#从pass.txt 文件中取密码,需要注意SELinux 会影响此命令执行,若执行失败可尝试关闭SELinux
ls -1h > log.txt 2>&1等同于
ls -1h &> log. txt
本来1–>屏幕( 1指向屏幕)
执行>log后,1–>1og. txt (1指 向log. txt)
执行2>&1后,2–>1 (2指 向1,而1指向log. txt,因此2也指向了log. txt)
shell变量
变量的做用
用来存放系统和用户需要使用的特定参数(值)
变量名:使用固定的名称,由系统预设或用户定义
变量值:能够根据用户设置、系统环境的变化而变化
变量的分类
自定义变量:由用户自己定义、修改和使用
环境变量:由系统维护,用于设置工作环境
位置变量:通过命令行给脚本程序传递参数
预定义变量: Bash中内置的一类变量,不能直接修改
自定义变量
定义新的变量
变量名=变量值
变量命名规则:以字母或下划线开头,区分大小写
echo $变量名
查看变量的值
等号(=)用来给变量赋值
等号(=)运算符左边是一个变量名,等号(=) 运算符右边是存储在变量中的值
product=benet
version=6.0
name=“sk”
赋值时使用引号
双引号:允许通过
符
号
弓
∣
用
其
他
变
量
值
单
引
号
:
禁
止
引
用
其
他
变
量
值
,
符号弓|用其他变量值 单引号:禁止引用其他变量值,
符号弓∣用其他变量值单引号:禁止引用其他变量值,视为普通字符
反撇号:命令替换,提取命令执行后的输出结果,、…、和$(…作用相同
从键盘输入内容为变量赋值
方法一
read [-p "提示信息"] 变量名
echo $变量名
方法二:
echo -n "提示信息"
read 变量名
echo $变量名
设置变量的作用范围
默认情况下,新定义的变量只在当前的Shell环境中有效,因此称为局部变量。当进入子程序或新的子Shel1环境时,默认情况下,新定义的变量只在当前的Shell环境中有效,因此称为局部变量。当进入子程序或新的子Shel1环境时
可以通过内部命令export将指定的变量导出为全局变量,使用户定义的变量在所有的子Shell环境中能够继续使用
格式1
export 变量名 ...
格式2
export 变量名=变量值 ...
两种格式可以混合使用
使用pstree命令可以查看Shell环境;
输入bash命令进入子Shell环境;
按Ctrl+D组合键或输入exit命令退出子Shell环境。
特殊的shell变量
环境变量
由系统提前创建,用来设置用户的工作环境
配置文件: /etc/profile、 ~/.bash_ _profile
export product version
导出为全局变量
bash
echo "Sproduct $version"
子程序引用全局变量
使用env命令可以查看到当前工作环境下的环境变量
常见的环境变量
变量USER表示用户名称,
HOME表示用户的宿主目录,
LANG表示语言和字符集,
PWD表示当前所在的工作目录,
变量PATH表示可执行程序的默认搜索路径
echo $ PATH
查看当前搜索路径
PATH="$PATH:/root "
将/root目录添加到搜索路径
export PATH="$PATH:/root"
输出为全局环境变量
first.sh
环境变量的全局配置文件为/etc/profile,在此文件中定义的变量作用于所有用户。每个用户还有自己的独立配置文件(~/.bashprofile)。可以用来长期变更或设置某个环境变量。
vim /root/.bash_profile
export HISTSIZE=200
修改root用户的历史命令记录条数
echo $HISTSIZE
source /root/.bash_profile
#读取并执行文件中的设置
echo $HISTSIZE
readonly命令设置只读变量
product=benet
readonly product
设置为只读变量
echo Sproduct
product=accp
只读变量不可以被重新赋值
unset product
只读变量不可以被删除,unset命令用于删除变量
整数变量的运算
格式: expr 变量1 运算符 变量2 [运算符 变量3]
常用的运算符
符号 | 做用 |
---|---|
+ | 加法 |
- | 减法 |
\ * | 乘法 |
/ | 除法 |
% | 取余 |
expr 12 * 5
常用的运算表达式:
i=$ (expr 10 \* 5)
i=$((10 * 5))
i=$[10 * 5]
let i=10*5
i++ 相当于 i=$[$i+1]
i-- 相当于 i=$ [$i- 1]
i+=2 相当于 i=$[$i+2]
浮点运算
bash不支持浮点运算,如果需要进行浮点运算,需要借助bc, awk处理。
加
echo "5.7+9.6" |bc
减
echo "5.7-9.6" |bc
乘
echo "5.70*9.60" |bc
除
echo "scale=2;5.7/9.6" |bc
混合运算
echo "2.2/ (2.2-1.1) *2+1.1"|bc