变量赋值
变量的定义
- 字母,数字,下划线
 - 不以数字开头
 
变量的赋值-变量替换
- 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 pos31
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