1、什么是shell变量
shell变量是用一个固定的字符串去表示不固定的内容
2、变量有哪些类型
1. 自定义变量
定义变量: 变量名=变量值 变量名必须以字母或下划线开头,区分大小写
ip1=192.168.1.1
引用变量: $变量名 或 ${变量名}
查看变量: echo $变量名 set(所有变量:包括自定义变量和环境变量)
取消变量: unset 变量名
作用范围: 仅在当前 shell 中有效
2. 环境变量
定义环境变量: 方法一 export back_dir2=/home/backup
方法二 export back_dir1 将自定义变量转换成环境变量
引用环境变量: $变量名 或 ${变量名}
查看环境变量: echo $变量名 env 例如 env |grep back_dir2
取消环境变量: unset 变量名
变量作用范围: 在当前 shell 和子 shell 有效
3. 位置变量
$1 $2 $3 $4 $5 $6 $7 $8 $9 ${10}
用法 脚本后面加参数,脚本中直接使用$1
4. 预定义变量
$0 脚本名
$* 所有的参数
$@ 所有的参数
$# 参数的个数
$$ 当前进程的 PID
$! 上一个后台进程的 PID
$? 上一个命令的返回值 0 表示成功
3、变量的定义方式
1、显式赋值
变量名=变量值
示例:
ip1=192.168.1.251
2、read从键盘输入
read -p "提示语: " test
#test为变量名
4、变量的计算
1、整数运算
expr 1 + 1
# 两个参数中间有空格
# expr 乘法使用方法和加减除不一致 要加上\ 如 expr 5 \* 2
echo $(($num1+$num2))
echo $[5**2]
let sum=2+3; echo $sum
2、小数运算
echo "2.0*4.2" |bc
echo "2.5^4" |bc
echo "scale=2;6/4" |bc
# scale=2 代表设置两位小数
5、printf格式化输出文本颜色
printf "\e[34m Hello World\n"
#\e 为转义符 [34m 为颜色 hello world 为要输出的话
#补充
echo -e "\033[40;34m Hello World"
\033 和 \e 意思相同
\33[0m 关闭所有属性
\33[1m 设置高亮度
\33[4m 下划线
\33[5m 闪烁
\33[7m 反显
\33[8m 消隐
\33[30m -- \33[37m 设置前景色(字体色)
30:黑 31:红 32:绿 33:黄 34:蓝色 35:紫色 36:深绿 37:白色
\33[40m -- \33[47m 设置背景色
40:黑 41:深红 42:绿 43:黄色 44:蓝色 45:紫色 46:深绿 47:白色
\33[nA 光标上移n行
\33[nB 光标下移n行
\33[nC 光标右移n行
\33[nD 光标左移n行
\33[y;xH设置光标位置
\33[2J 清屏
\33[K 清除从光标到行尾的内容
\33[s 保存光标位置
\33[u 恢复光标位置
\33[?25l 隐藏光标
\33[?25h 显示光标
6、$ @和$*有什么区别?
不加“”时 $@ 和$* 没有区别,加上“”变成“$@”,"$*";$* 会把所有的参数当成整体输出,$@还是会单独输出每一个参数
7、如何给变量设置默认值
${变量名-新的变量值}
变量没有被赋值:会使用“新的变量值“ 替代
变量有被赋值(包括空值): 不会被替代
${变量名:-新的变量值}
变量没有被赋值(包括空值):都会使用“新的变量值“ 替代
变量有被赋值: 不会被替代