Shell 变量
什么是shell变量?
变量的类型
变量的定义方法
变量的运算
变量 "内容" 的删除和替换
shell变量?用一个特定的字符串去表示不固定的内容
变量 variable [ˈveriəbl]
变量的类型:
1. 自定义变量
定义变量: 变量名=变量值 变量名必须以字母或下划线开头,区分大小写
引用变量: $变量名 或 ${变量名}
查看变量: echo $变量名 set(所有变量:包括自定义变量和环境变量)
取消变量: unset 变量名
作用范围: 仅在当前shell中生效
2. 环境变量
定义环境变量: 方法一 export dir_path=/data/lib/
方法二 export dir_path 将自定义变量转换成环境变量
引用环境变量: $变量名 或 ${变量名}
查看环境变量: echo $变量名 env 例如:env | grep dir_path
取消环境变量: unset 变量名
变量作用范围: 在当前shell和子shell有效
C语言 局部变量 vs 全局变量
SHELL 自定义变量 vs 环境变量
3. 位置变量
$1 $2 $3 $4 $5 $6 $7 $8 $9 ${10}
4. 预定义变量
$0 脚本名
$* 所有的参数
$@ 所有的参数
$# 参数的个数
$$ 当前进程的PID
$! 上一个后台进程的PID
$? 上一个命令的返回值 0表示成功
变量的赋值方式:
1. 显示赋值
变量名=变量值
示例:
IP1=192.168.1.1
school=“Beijing”
today1=`date +%F`
today2=$(date +%F)
2. read 从键盘读入变量值
read 变量名
read -p "提示信息:" 变量名
read -t 5 -p "提示信息:" 变量名
read -n 2 变量名
参数:
-t 等待时间
-n 字符限制
定义或引用变量时注意事项:
" " 弱引用
' ' 强引用
v_nanruosen➜~» name=south v_nanruosen➜~» echo "${name} is good" south is good v_nanruosen➜~» echo '${name} is good' ${name} is good
` ` 命令替换 等价于 $() 反引号中的shell命令会被先执行
v_nanruosen➜~» touch `date +%F`_south.log v_nanruosen➜~» touch $(date +%F)_south.log v_nanruosen➜~» disk_free1="df -h |grep '/$'|awk '{print $4}'" 错误 v_nanruosen➜~» disk_free2=$(df -h |grep '/$'|awk '{print $4}') v_nanruosen➜~» disk_free3=`df -h |grep '/$'|awk '{print $4}'`
变量的运算:
1. 整数运算
方法一:expr expr 1 + 2 expr $num1 + $num2 + - \* / % 方法二:$(()) echo $(($num1+$num2)) + - * / % echo $((num1+num2)) echo $((5-3*2)) echo $(((5-3)*2)) echo $((1**2)) sum=$((1+2));echo $sum 方法三:$[] echo $[20+30] + - * / % echo $[2**10] 方法四:let let sum=2+3;echo sum let i++;echo $i
2. 小数运算
echo "2*3" | bc echo "2^3" | bc echo "scale=2";6/4" bc #scale=2保留两位小数 awk 'BEGIN{print 1/2}' echo "print 5.0/2" | python
变量"内容"的删除和替换 (扩展)
1. "内容" 的删除
v_nanruosen➜~» url="www.cnblogs.com.nanruosen.cn" v_nanruosen➜~» echo ${#url} 获取变量值的长度 28 v_nanruosen➜~» echo ${url} 标准查看 www.cnblogs.com.nanruosen.cn v_nanruosen➜~» echo ${url#www.} 从前往后,删除"#"后的内容 cnblogs.com.nanruosen.cn v_nanruosen➜~» echo ${url#*.} 从前往后,最短匹配 cnblogs.com.nanruosen.cn v_nanruosen➜~» echo ${url##*.} 从前往后,最长匹配 贪婪匹配 cn v_nanruosen➜~» url="www.cnblogs.com.nanruosen.cn" v_nanruosen➜~» echo ${url%.cn} 从后往前,删除"%"后的内容 www.cnblogs.com.nanruosen v_nanruosen➜~» echo ${url%.*} 从后往前,最短匹配 www.cnblogs.com.nanruosen v_nanruosen➜~» echo ${url%%.*} 从后往前,最长匹配 贪婪匹配 www v_nanruosen➜~» echo ${url#com.} 错误的匹配 www.cnblogs.com.nanruosen.cn v_nanruosen➜~» echo ${url#*com.} nanruosen.cn 索引及切片 www.cnblogs.com.nanruosen.cn 0123456789...... v_nanruosen➜~» echo ${url:0:10} www.cnblog v_nanruosen➜~» echo ${url:4:11} cnblogs.com v_nanruosen➜~» echo ${url:5} nblogs.com.nanruosen.cn
2. "内容" 的替换
v_nanruosen➜~» url="www.cnblogs.com.nanruosen.cn" v_nanruosen➜~» echo ${url/cnblogs/baidu} www.baidu.com.nanruosen.cn v_nanruosen➜~» echo ${url/n/N} www.cNblogs.com.nanruosen.cn v_nanruosen➜~» echo ${url//n/N} 从左往右,"//" 全部替换 贪婪匹配 www.cNblogs.com.NaNruoseN.cN
3. 变量的替代
v_nanruosen➜~» unset var1 取消变量 v_nanruosen➜~» echo ${var1} v_nanruosen➜~» v_nanruosen➜~» echo ${var1-newvar} "-" 替换变量,"var1"没有定义 可以被直接替代 newvar v_nanruosen➜~» var2=1111 v_nanruosen➜~» echo ${var2-2222} "var2"已经定义 "-" 不可替代原有变量 1111 v_nanruosen➜~» echo ${var2+3333} "+" 会覆盖原有变量 3333 v_nanruosen➜~» var3= v_nanruosen➜~» echo ${var3-aaaa} "var3"已经被定义没有内容,不可替代 v_nanruosen➜~» ${变量名-新的变量值} 变量没有被赋值: 会使用"新的变量值"替代 变量有被赋值(包括空值): 不会被替代 v_nanruosen➜~» unset var1 v_nanruosen➜~» var2= v_nanruosen➜~» var3=3333 v_nanruosen➜~» echo ${var1} v_nanruosen➜~» echo ${var1:-1111} 1111 v_nanruosen➜~» echo ${var2:-1111} 1111 v_nanruosen➜~» echo ${var3:-1111} 3333 ${变量名:-新的变量值} 变量没有被赋值(包括空值): 都会使用"新的变量值"替代 变量有被赋值: 不会被替代 v_nanruosen➜~» echo ${var3+aaaa} v_nanruosen➜~» echo ${var3:+aaaa} v_nanruosen➜~» echo ${var3=aaaa} v_nanruosen➜~» echo ${var3:=aaaa} v_nanruosen➜~» echo ${var3?aaaa} v_nanruosen➜~» echo ${var3:?aaaa}
i++ 和 ++i
1. 对变量的值的影响:
v_nanruosen➜~» i=1 v_nanruosen➜~» let i++ v_nanruosen➜~» echo $i 2 v_nanruosen➜~» j=1 v_nanruosen➜~» let ++j v_nanruosen➜~» echo $j 2
2. 对表达式的值的影响:
v_nanruosen➜~» i=1 v_nanruosen➜~» j=1 v_nanruosen➜~» let x=i++ 先赋值,后运算 (x=i) v_nanruosen➜~» let y=++j 先运输,后赋值 (++j) v_nanruosen➜~» echo $i 2 v_nanruosen➜~» echo $j 2 v_nanruosen➜~» echo $x 1 v_nanruosen➜~» echo $y 2
本文作者:nanruosen
本文链接:https://www.cnblogs.com/nanruosen/p/var.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步