搞搞BASH

语法之特别

特别是相对的,BASH语法的特别是相对与C系编程语言以而言。

关于空格

某些地方必须使用空格,如方括号中的表达式:

if [ -e /www ]; then
if [ ! -e /www ]; then

而某些地方又不可以使用空格,如赋值:

export PWD=$(pwd)

测试和比较

test和[]是等价的,都可以用于测试一个表达式,测试结果可以用于条件判断,同时存放于$?变量中。

test 3 -gt 4; echo $?

结果显示:

1

因为1表示false,0表示true。这和Linux C函数的返回值定义是一致的。

算术比较使用-gt,-lt,-eq,-ne;字符串比较则使用==,!=,>,<。以及:

  • -z:字符串为空
  • -n:字符串不为空

此外,还有大量的文件系统判断命令,可以让本来很复杂的系统检查变得非常方便:

  • -d: 目标存在且是一个目录。
  • -e: 目标存在。
  • -f: 目标存在且是一个普通文件。
  • -r: 目标可读。
  • -w: 目标可写。
  • -x: 目标可执行。
  • -L: 目标是一个链接。

逻辑运算符

  • ||
  • &&

使用变量

命令行参数

通过特殊的变量可以引用Bash接受的命令行参数:

  • $#:命令行参数的个数,相当于C语言中的argc。
  • $@:字符串组形式的命令行参数,其中的每个字符串对应一个参数,相当于C语言中的argv。
  • $0, $1, … :单个命令行参数,相当于C语言中的argv[0], argv[1], …
  • $*:全部命令行参数。
  • $?:上一条命令的返回值。

分支与循环

Bash允许根据某个命令的返回值来进行跳转,最常用的即以上提到的test,或[]。必须注意的是,Bash的规范以0返回值表示“真”。

遍历

利用BASH脚本可以遍历一个列表看上去很简单,使用如下语法:

for I in $VAR; do echo $I; done

这种做法常常很有用,因为要遍历的列表不仅仅是一个变量,还可以是某个Linux命令的输入,如:

for I in `ls`
do
    if [ ! -d $I ]
      then
         chmod 777 $I
    fi
done

以上脚本可以将当前目录下的文件全部修改为777模式。

深入Linux系统

 
tech/programming/bash.txt · Last modified: 2014/11/10 08:22 (external edit)
 
Except where otherwise noted, content on this wiki is licensed under the following license:CC Attribution-Noncommercial-Share Alike 3.0 Unported
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki