Linux 系统中的 Shell是一个特殊的应用程序,它介于操作系统内核与用户之间,充当了一个“命令解释器”的角色,负责接收用户输入的操作指令(命令)并进行解释,将需要执行的操作传递给内核执行,并输出执行结果
Shell脚本概述
交互;非交互
Bash(/bin/bash)是目前大多数 Linux 版本采用的默认 Shell,(BourneAgainShell)
编写脚本执行的方式
- source .点(在当前的解释器下执行脚本中的指令)
- bash sh(先打开子一级的bash,子bash执行指令,退出)
- ./跟bash差不多,但需要执行权限:(chmod +x 文件名)
1、重定向
-
- 标准输出(STDOUT):屏幕;命令将执行后的输出结果发送到标准输出文件
- 正确信息重定向输出:1>或>
- 错误信息重定向输出:2>
- 所有信息重定向输出:&>
- 不覆盖原内容,追加内容输出:>>
- 标准输入(STDIN):键盘;命令将从标准输入文件中读取在执行过程中需要的输入数据
- 重定向输入:目标文件 --stdin < 源文件(将源文件内容写入目标文件) ##需要注意 SELinux 会影响此命令执行,若执行失败可尝试关闭 SELinux
- 标准错误(STDERR):屏幕;命令将执行期间的各种错误信息发送到标准错误文件
- 错误重定向使用“2>”操作符,其中“2"是指错误文件的编号
- 标准输出(STDOUT):屏幕;命令将执行后的输出结果发送到标准输出文件
2、管道符操作
使用grep命令和awk命令
[root@localhost ~]# grep "/bin/bash$" /etc/passwd | awk -F:'{print$1,$7}'
一、Shell变量
1、自定义变量
定义变量的基本格式为“变量名=变量值”,等号两边没有空格。变量名称需以字母或下划线开头,名称中不要包含特殊字符和数字(如+、-、*、1、.、?、%、&、#等)
2、查看和引用变量的值
-
-
- echo 命令可以查看变量,可以在一条 echo 命令中同时査看多个变量值
-
[root@localhost ~]# echo $Product
Python
[root@localhost ~]# echo $Product $Version
Python 2.7.13
-
-
- 当变量名称容易和紧跟其后的其他字符相混淆时,需要添加大括号“{}”将其括起来,否则将无法确定正确的变量名称,对于未定义的变量,将显示为空值
-
[root@localhost ~l# echo $Product2.5 //变量 Product2.5 并未定义
5
[root@localhost ~l# echo $fProduct}2.5
Python2.5
3、变量赋值的特殊操作
(1)双引号("")
-
-
- 双引号主要起界定字符串的作用,特别是当要赋值的内容中包含空格时,必须以双引号括起来;其他情况下双引号通常可以省略
- 在双引号范围内,使用“$”符号可以引用其他变量的值(变量引用),从而能够直接调用现有变量的值来赋给新的变量
-
[root@localhost ~]# PYTHON=Python 2.7.13 //错误的赋值
bash: 2.7.13: command not found
[root@localhost ~]# PYTHON="Python 2.7.13" //正确的赋值
[root@localhost ~l# echo $PYTHON
Python 2.7.13[root@localhost ~]# PyVersion="Python $Version" //以变量的值进行赋值
[root@localhost ~l# echo $PyVersion
Python 2.7.13
(2)单引号(' ')
-
-
- 当要赋值的内容中包含$、“、\等具有特殊含义的字符时,应使用单引号括起来。在单引号的范围内,将无法引用其他变量的值,任何字符均作为普通字符看待,但赋值内容中包含单引号(')时,需使用!符号进行转义,以免冲突
-
[root@localhost ~]# PyVersion='Python $Version' //$符号不能再引用变量
[root@localhost ~]# echo $PyVersion //原样输出字符串
Python $Version
(3)反撇号(``)
-
-
- 反撇号主要用于命令替换,允许将执行某个命令的屏幕输出结果赋值给变量。反撇号括起来的范围内必须是能够执行的命令行,否则将会出错
-
[root@localhost ~]# ls -lh `which useradd`
-rwxr-x---.1 root root 101K8月22011 /usr/sbin/useradd
-
-
- 需要注意的是,使用反撇号难以在一行命令中实现嵌套命令替换操作,这时可以改用“$()"来代替反撇号操作,以解决嵌套的问题
-
[root@localhost ~]# rpm -qc $(rpm -gf $(which useradd))
/etc/default/useradd
/etc/login .defs
(4)read命令
-
-
- 使用 Bash 的内置命令 read 来给变量赋值
- read 命令用来提示用户输入信息,从而实现简单的交互过程。执行时将从标准输入设备(键盘)读入一行内容,并以空格为分隔符,将读入的各字段依次赋值给指定的变量(多余的内容赋值给最后一个变量)
-
[root@localhost ~]# read ToDir1
/opt/backup/ //输入变量 ToDir1 的值为/opt/backupl
[root@localhost ~]# echo $ToDir1
/opt/backup/
-
-
- read 命令可以结合“-p”选项来设置提示信息,以便告知用户应该输入什么内容等相关事项
-
[root@localhost ~]# read -p"请指定备份存放目录:"ToDir2
请指定备份存放目录:/opt/backup
[root@localhost ~l# echo $ToDir2
/opt/backup
4、设置变量的作用范围
export 将指定的变量导出为全局变量,用户可以同时指定多个变量名称作为参数(无须使用“$”符号),变量名之间以空格分隔
使用 export 导出全局变量的同时,也可以为变量进行赋值,这样在新定义全局变量时就不需要提前进行赋值了
[root@localhost ~]# echo "$Product $Version" //查看当前定义的变量值
Python 2.7.13
[root@localhost ~]# export Product Version //将 Product、Version 设为全局变量
[root@localhost ~]# bash
[root@localhost ~# echo "$Product $Version" //进入子 Shell 环境
Python 2.7.13 //可以调用父 Shell 的全局变量
[root@localhost ~l# exit //返回原有的 Shell 环境[root@localhost ~l# export FQDN="www.ib-aptech.com.cn"
[root@localhost ~]# echo $FQDN
www.ib-aptech.com.cn
5、数值变量的运算
expr 变量1($1) 运算符 变量2($2)[运算符变量 3]...
+:加法运算
-:减法运算
\*:乘法运算,注意不能仅使用“*”符号,否则将被当成文件通配符
/:除法运算
%:求模运算,又称为取余运算,用来计算数值相除后的余数
二、Shell变量
1、环境变量
- env
- PATH
环境变量的配置文件
[root@localhost ~]# vim /root/.bash_profile
[root@localhost ~]# source /root/.bash_profile //读取并执行文件中的配置,无需重启
2、只读变量
Shell 变量中有一种特殊情况,一经设定,其值是不可改变的,这种变量被称为只读变量。在创建变量的时候可将其设置为只读属性,也可以将已存在的变量设置为只读属性,只读变量主要用于变量值不允许被修改的情况
[root@localhost ~l# name=cloud
[root@localhost ~l# readonly name //设置为只读变量
[root@localhost ~l# echo $name
cloud
[root@localhost ~# name=yun
-bash: name: readonly variable //只读变量不可以被重新赋值
3、位置变量
为了在使用 Shel 脚本程序时,方便通过命令行,为程序提供操作参数,Bash 引入了位置变量的概念。当执行命令行操作时,第一个字段表示命令名或脚本程序名,其余的字符串参数按照从左到右的顺序依次赋值给位置变量
位置变量也称为位置参数,使用$1、$2、$3、…、$9 表示
[root@localhost ~]# vim adder2num.sh
#!/bin/bash
SUM='expr $1 + $2
echo "$1 + $2 = $SUM"
[root@localhost ~]# chmod +x adder2num.sh
[root@localhost ~]# ./adder2num.sh 12 34 //$1 为 12、$2 为 34 的情况
12+34=46
[root@localhost ~]# ./adder2num.sh 56 78 //$1为 56、$2 为 78 的情况
56+78=134
4、预定义变量
- 预定义变量是由 Bash程序预先定义好的一类特殊变量,用户只能使用预定义变量,而不能创建新的预定义变量,也不能直接为预定义变量赋值。预定义变量使用“$”符号和另一个符号组合表示
- $#:表示命令行中位置参数的个数
- $*:表示所有位置参数的内容
- $0:表示当前执行的脚本或程序的名称
- $?:表示前一条命令执行后的返回状态,返回值为0表示执行正确,返回任何非 0值均表示执行出现异常
- $!上一个父进程号
- $$本进程号