变量赋值
变量的定义
- 字母,数字,下划线
- 不以数字开头
变量的赋值-变量替换
- shell的脚本不区分类型
- 变量名=变量值
- a=133
- 使用let为变量赋值
- let a=10+20
- 将命令赋值给变量
- l=ls
- 将命令结果赋值给变量,使用$()或者``
- letc=$(ls -l /etc)
- 变量值有空格等特殊字符可以包含在””或’’中
变量的引用
- ${变量名}称作对变量的引用
- echo ${变量名} 查看变量的值
- ${变量名} 在部分情况下可以省略为 $变量名
变量的作用范围
- 默认只在当前的shell,其子进程和父进程和平行的进程都不会生效
- 脚本中的变量默认在当前的bash也不会生效
- 如果想让脚本的变量也可以使用其他的进程使用使用. 和source的方式
- 还可以通过export来导出变量,使得子进程可以访问父进程的变量
- 删除变量:unset 变量名
系统环境变量
环境配置:每个Shell打开都可以获得到的变量
- set和env命令
- 可以查看默认的环境变量
- set可以查看更多变量
- $? $$ $0 //预定义变量
- $? :可以用来确认上一次命令是否执行成功,返回为0即为成功
- $$:显示当前进程的PID
- $0:显示当前进程的名称
- $PATH
- 使用echo $PATH来来看当前命令的搜索路径
- PATH=$PATH:/root //添加了/root为搜索路径
- 环境变量只对当前的shell的任意位置生效,子进程也可以生效
- 而当我们使用新的终端,则不会生效
- $PS1
- 可以使得终端显示个性化信息
- set和env命令
位置变量
$1 $2 $n
#!/bin/bash # $1 $2...${10} pos1=$1 pos2=$2 echo pos1 echo pos3
1
2
3
4
5
6
7
8
- 当我们在执行脚本传递参数的时候,会传递到$n这个变量中
- ```shell
#!/bin/bash
# $1 $2...${10}
echo $1
echo $2事实上上面的两段代码的作用效果时相同的,如果我们给上面的脚本加上两个参数,便会显示这两个参数
当我们读入的参数如果时空值可能会出现一些错误,我们可以用下面的写法
#!/bin/bash echo $1 echo ${2}_
这样在有参数的时候会去掉 _而没有参数的时候则会为 _1
2
3
4
5
6
7
8
9
10
11
12
- 代表如果$2时空值读入_
- 这样的小技巧 显然又会带来另外的一个问题:如果我们的参数不是空值不久多出来了_吗因此我们可以来使用下下面的写法
- ```shell
#!/bin/bash
pos1=$1
pos2=${2-_}
echo $pos1
echo $pos2
环境变量配置文件
- /etc/profile //所有用户的通用配置文件
- /etc/profile.d/
- ~/.bash_profile //用户特有
- ~/.bashrc //用户特有
- /etc/bashrc //所有的用户通用的配置文件
- 当我们使用su - root四个脚本都会被执行
- 如果只使用su root则只会执行.bashrc和/etc/bashrc
- 如果我们想要添加环境变量,在以上的四个文件均可
- export PATH=$PATH:new/path
- 为了保证子进程可以访问到环境变量我们需要在前面加上export
- 当我们将新的环境变量写入到配置文件中并不会立即的生效
- 可以通过exit来重新打开bash也可以使用source /etc/bashrc
数组
定义数组
IPTS=( 192.168.1 192.168.2 192.168.3)
显示数组中的所有元素
echo ${IPTS[@]}
显示数组元素的个数
echo ${#IPTS[@]}
显示数组的第一个元素
echo ${IPTS[0]}
转义与引用
特殊字符:一个字符不仅有字面意义,还有元意
注释
- ;分号
- 连接两个命令,或者两个脚本
转义
- \转义符号
\n \r \t
单个字母的转义-
\ $ \ " \\ \
单个非字母的转义
- ;分号
引用
“”和’’
使用单引号 就会原样输出
而如果我们使用双引号就可以对变量进行解释
运算符
赋值运算符
- = 可以用于算数赋值和字符串赋值
- 使用unset取消为变量的赋值
- =除了作为赋值运算符还可以作为测试操作符
算数运算符
基本运算符
+ - * / ** %
使用expr进行运算
expr 4+5
数字常量
- let “变量名=变量值”
- 变量值使用0开头为八进制
- 变量值使用0x开头为十六进制
双圆常量
- 双圆括号时let命令的简化
(( a = 10 ))
(( a++ ))
echo $((10 + 20))
num1 = expr 4+ 5
- 双圆括号时let命令的简化
特殊符号大全
引号
- ’完全引用
- “不完全引用:会对变量进行解释
- ·执行命令
括号
- () (()) $()圆括号
- 单独使用圆括号 会产生一个子shell (xyz=123)
- 数组的初始化ips=(ip1 ip2 ip3)
- 两个圆括号是可以进行一个运算
- 还可以使用$(命令) ,可以将命令的结果赋值给变量
- [] [[]]方括号
- 单独使用方括号是测试(test)或数组元素功能
- [ 5 -gt 4 ] 用来比较大小如果大于 则返回0的值,可以使用echo $?来进行查看
- 两个方括号表示测试表达式
- [[ 5 > 4 ]]两个方括号可以直接使用< >
- 单独使用方括号是测试(test)或数组元素功能
- <>尖括号 重定向符号
- ls > a.txt
- 2> 可以记录一些错误的信息
- {}花括号
- 输出范围 echo{0..9}
- 文件复制cp /etc/passwd{,.bak} = cp -v /etc/passwd /etc/passwd.bak
- () (()) $()圆括号
运算和逻辑符号
+ - * / %
算术运算符> < =
比较运算符&& || !
逻辑运算符号
转义符号
其他符号
- #注释符号
- ;命令分隔符
- case语句的分隔符需要转义;;
- :空指令
- .和source命令相同
- ~家目录
- ,分隔符
- *通配符
- ?条件测试 或 通配符
- $取值符号
- |管道符号
- &后台运行符号
- _空格
test比较(测试与判断)
退出与退出状态
- 测试与判断
- exit
- exit 10返回10给shell,返回非0位不正常退出
- $?判断当前的shell前一个进程是否正常退出
- 测试与判断
测试命令 test
- 文件测试
- 整数比较测试
- [ 5 -gt 7 ]
- 字符串测试
- [ “abc” = “abc” ]
- 字符串的比较是区分大小写的
test可以简化为[]符号
[[]]此类方法位扩展写法支持&& || < >
使用if-then语句
- if-then语句的基本用法
- if [ 测试条件成立 ] 或者命令返回值是否为0
- then 执行相应的命令
- fi 结束
- 例如我们可以使用if [ $UID = 0 ]或[ $USER = root ]来判断当前用户是否是root
- if-then语句的基本用法
使用if-then-else语句
if [ 测试条件成立 ]
then 执行相应命令
else 测试条件不成立,执行相应命令
fi 结束
#!/bin/bash if [ $USER = root ] ;then echo " user root " else echo " other user " fi
下面是一些举例1
2
3
4
5
6
7
8
9
10
我们还有另外的一种使用方法
```shell
if [ 测试条件成立 ]
then 执行相应命令
elif [ 测试条件成立 ]
then 执行相应命令
else 测试条件不成立,执行相应命令
fi 结束1
2
3
4
5
6
7
8
9!/bin/bash
root geek other
if [ $USER = root ] ; then
echo "root"
elif [ $USER = geek ] ; then
echo "geek"
else
echo "other user"
fi
嵌套if的使用
适用于判断两个条件
#if 条件测试中可以再 嵌套if条件测试 if [ 测试条件成立 ] then 执行相应命令 if [ 测试条件成立 ] then 执行相应的命令 fi 结束 fi 结束
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
- 下面进行一个简单的举列
- ```shell
#!/bin/bash
#demo if then if then fi fi
if [ $UID = 0 ] ; then
echo "please run"
if [ -x /tmp/10.sh ] ; then
/tmp/10.sh
fi
else
echo "switch user root"
fi