bash shell常见问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wenzhou1219/article/details/88759991

全局变量和局部变量

变量设置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。

原创,转载请注明来自

猜你喜欢

转载自blog.csdn.net/wenzhou1219/article/details/88759991