全局变量和局部变量
变量设置var=xxx,var和=中间能不能有空格,否则var会被当作命令执行。全局变量必须使用export导出,否则在子shell中无法生效。
几种括号区别
bash中最让人崩溃的是各种表达方式的微弱差别含义完全不一样。常见的几种括号及含义如下:
圆括号()
- 变量替换 a=$(date)和反引号a=
date
作用相同 求取对应命令值,赋给对应变量 - 进程列表 (date;time) 一组进程放到子shell中执行
- 双括号中可执行高级数学表达式 比如
((a2=$a>>1))
或 if((a2=$a>>1 < 1)) ...
方括号[]
- 简单数学计算,只支持整数和加减乘除,比如
a=$[1+2]
复杂浮点计算可使用zsh或bc来计算,如
a=$(echo "1.32*1.46"|bc)
- 替换test完成命令条件判断,注意方括号的前后必须有空格,操作符-eq/=/-d等前后也必须有空格,比如
数值比较 [ n1 -eq n2 ]
字符串比较 [ $a = "123" ]
文件比较 [ -d f ]
- 双方括号支持字符串的模式匹配方法 [[]] 同样注意和单括号一样的空格问题
a="123"
if [[ $a = 1* ]]; then echo '123'; fi
大括号{}
- 取变量值,特别用于字符串中嵌入变量取值,如
a="this is a ${name}"
各种配置文件
常见的几种配置文件如下
- /etc/profile
- ~/.bash_profile
- ~/.bash_login
- ~/.profile
- ~/.bashrc
要弄懂这些配置文件的使用场合,需要结合bash的几种shell来说:
登录shell
/etc/profile只有在系统登录时才会调用,部分系统会将许多配置拆分到/etc/profile.d/目录下。
交互式shell
包括后台运行的子shell,当前登录shell中新起的shell都属于此种类型,注意shell的子进程只会继承它的全局变量。这种情况按照如下顺序查找加载配置文件:
- ~/.bash_profile
- ~/.bash_login
- ~/.profile
.bashrc一般是由.bash_profile加载的。
非交互式shell
最常见的就是crontab定时运行的脚本。这种shell上述几种配置文件都不会加载,如果指定了BASH_ENV,它会加载对应位置的配置。
通常在正常bash环境中编写的shell脚本crontab运行时需要先source ~/.bashrc或source ~/.bash_profile。
原创,转载请注明来自