一. 自定义变量                                           

命名规则     字母数字下划线,不能以数字开头
定义变量: 变量名=变量值 变量名必须以字母或下划线开头,区分大小写   ip1=192.168.2.115 
引用变量: $变量名 或 ${变量名}
查看变量: echo $变量名  set(所有变量:包括自定义变量和环境变量)
取消变量: unset 变量名
作用范围: 仅在当前shell中有效

二. 环境变量

shell在开始执行时已经定义好的
    env       查看所有环境变量
    set        查看所有变量
                                 环境变量拥有可继承性:export之后就拥有继承性
    export       导出变量(作用范围)  
临时生效
永久生效
 
写入4个登陆脚本中     ~/.bashrc   ~/.profile                
更好放在/etc/profile.d/* 下建立独立的环境变量配置文件
 
 PATH
 
$USER  $PWD     $HOME $SHELL     $HOSTNAME
用户名 当前位置 家目录 登录shell 主机名

三. 位置变量

   执行脚本时,给脚本传递的参数
$1 $2 $3 $4 $5 $6 $7 $8 $9 ${10}

四. 预定义变量

$0              脚本名
$*   所有的位置参数
$@   所有的位置参数
$#   位置参数的个数
$$   当前进程的PID
$!               上一个后台进程的PID
$?   上一个命令的返回值 0表示成功

五. 赋值

显示赋值[直接赋值]
name=goudan
mem_free=`free -m | awk 'NR==2{print $7}'`
从用户输入赋值
    read -p "提示信息" 变量名

六.运算

 
6.1整数运算
expr $num1+$num2
$[num1+num2]  $[$num2+$num2]
$(($num2+$num2))
 
6.2小数运算
echo "scale=2;1/2" | bc
echo "print 1.0/2" | python

举例:

1、显式赋值

变量名=变量值
示例:
ip1=192.168.1.251
school="BeiJing 1000phone"
today1=`date +%F`       //`` 反引号,先执行引号内的内容再赋值
today2=$(date +%F)      //$()先执行括号内的内容再赋值
 

2、read 从键盘读入变量值

read 变量名
read -t 5 -p "提示信息: " -n 2 变量名   -t 5 等待5秒, -p 提示信息   -n 2 输入的字符数量
 
例如
                read name 
                read -p "请输入你的性别: " sex
                read -p "请输入你的年龄: " -t 3 -n 2 age
 

3、定义或引用变量时注意事项

" "      弱引用   会对引用的变量进行替换
' '     强引用 所见即所得
 
# cat a1.sh
#!/usr/bin/env bash
 
age=22
echo -e "年龄为 $age \ta"
echo -e '年龄为 $age \ta'
# ./a1.sh 
年龄为 22 a
年龄为 $age a

4、反引号``  命令替换 等价于 $()  , 反引号中的shell命令会被先执行

# cat a1.sh
#!/usr/bin/env bash
 
 
MEM_FREE=`free -m |awk 'NR==2{print $7}'`
MEM_FREE2=$(free -m |awk 'NR==2{print $7}')
 
echo "内存剩余量为: $MEM_FREE, $MEM_FREE2"
 
# ./a1.sh 
内存剩余量为: 7913, 7914

5、运算

加 +、减 1、乘 *、除[取整]/、取余[取模]%、幂运算**、
 
整数运算
方法一:expr
expr 1 + 2
expr $num1 + $num2    +  -  \*  /  %
 
方法二:$(())
echo $(($num1+$num2))      +  -  *  /   %
echo $((num1+num2))
echo $((5-3*2))
 
方法三:$[]
echo $[5+2]          +  -  *  /  %
echo $[5**2]
 
方法四:let
let sum=2+3; echo $sum
let i++; echo $i
 
小数运算
echo "2*4" |bc
echo "2^4" |bc
echo "scale=2;6/4" |bc
awk 'BEGIN{print 1/2}'
echo "print 5.0/2" |python
 
-------------------------------------------
5.1、整数运算
# cat a1.sh
#!/usr/bin/env bash
 
a=5
b=2
 
sum=$[$a+$b]
echo "a加b等于 $sum"
jian=$[$a-$b]
echo "a减b等于 $jian"
cheng=$[$a*$b]
echo "a乘b等于 $cheng"
chu=$[$a/$b]
echo "a除b等于 $chu"
mo=$[$a%$b]
echo "a模b等于 $mo"
# ./a1.sh 
a加b等于 7
a减b等于 3
a乘b等于 10
a除b等于 2
a模b等于 1
 
 
5.2、小数运算
# cat a1.sh 
#!/usr/bin/env bash
echo "print 5.0/2" | python
 
# ./a1.sh 
2.5

6、转义:\

    为了显示元字符,需要引用。当一个字符被引用时,其特殊含义被禁止
    把有意义的变的没意义,把没意义的变的有意义  
    \n  \t \\n 
 
# cat a1.sh
#!/usr/bin/env bash
 
echo -e 'a\nb'
echo -e 'c\\nb'
# ./a1.sh 
a
b
c\nb

7、变量长度   [在shell中纯粹数个数]

# cat a1.sh 
#!/usr/bin/env bash
 
a=$1
echo "变量a的值为 $a,变量a的长度为${#a}"
 
# ./a1.sh zhangsan
变量a的值为 zhangsan,变量a的长度为8
 
# ./a1.sh 张三
变量a的值为 张三,变量a的长度为2
 
# ./a1.sh 张三1afaf
变量a的值为 张三1afaf,变量a的长度为7

8、让用户输入两个数字,然后分别输出两个数字的加减乘除的结果

# cat a1.sh
#!/usr/bin/env bash
 
read -p "请输入第一个数字: " num1
read -p "请输入第二个数字: " num2
 
echo "加: $[$num1+$num2]"
echo "减: $[$num1-$num2]"
echo "乘: $[num1*num2]"
echo "除: $[num1/num2]"
 
# ./a1.sh
请输入第一个数字: 1
请输入第二个数字: 4
加: 5
减: -3
乘: 4
除: 0