交互Shell : 是指用户在提示符下输命令的Shell, 自动执行~/.bashrc脚本
登录Shell : 是在输入用户名和密码登录后得到的Shell
PS:
从图形界面的窗口管理器登录之后会显示桌面不会产生登录Shell(也不会执行启动脚本),
在图形界面下打开终端窗口得到的Shell也不是登录Shell。
启动bash会自动执行以下脚本:
1 首先执行/etc/profile,系统中每个用户登录时都要执行这个脚本
2 然后依次查找当前用户主目录的~/.bash_profile、~/.bash_login和~/.profile三个文件
PS:
bash规定首先查找以~/.bash_开头的启动脚本,如果没有则执行~/.profile,是为了和sh保持一致。
顺便一提,在退出登录时会执行~/.bash_logout脚本(如果它存在的话)。
表 31.2. 测试命令
[ -d DIR ] 如果DIR存在并且是一个目录则为真
[ -f FILE ] 如果FILE存在且是一个普通文件则为真
[ -z STRING ] 如果STRING的长度为零则为真
[ -n STRING ] 如果STRING的长度非零则为真
[ STRING1 = STRING2 ] 如果两个字符串相同则为真
[ STRING1 != STRING2 ] 如果字符串不相同则为真
[ ARG1 OP ARG2 ] ARG1和ARG2应该是整数或者取值为整数的变量,OP是-eq(等于)-ne(不等于)-lt(小于)-le(小于等于)
-gt(大于)-ge(大于等于)之中的一个
表 31.3. 带与、或、非的测试命令
[ ! EXPR ] EXPR可以是上表中的任意一种测试条件,!表示逻辑反
[ EXPR1 -a EXPR2 ] EXPR1和EXPR2可以是上表中的任意一种测试条件,-a表示逻辑与
[ EXPR1 -o EXPR2 ] EXPR1和EXPR2可以是上表中的任意一种测试条件,-o表示逻辑或
结构控制if/then/elif/else/fi
: 是一个特殊的命令,称为空命令,该命令不做任何事,但Exit Status总是真
read命令的作用是等待用户输入一行字符串,将该字符串存到一个Shell变量中
= 在条件判断里表示是否相等的判断
Shell还提供了&&和||语法,和C语言类似,具有Short-circuit特性
结构控制case/esac
而Shell脚本的case可以匹配字符串和Wildcard,每个匹配分支可以有若干条命令,末尾必须以;;结束,
执行时找到第一个匹配的分支并执行相应的命令,然后直接跳到esac之后,不需要像C语言一样用break跳出。
结构控制for/do/done
for FRUIT in apple banana pear; do
echo "I like $FRUIT"
done
结构控制while/do/done
COUNTER=1
while [ "$COUNTER" -lt 10 ]; do
echo "Here we go again"
COUNTER=$(($COUNTER+1))
done
表 31.4. 常用的位置参数和特殊变量
$0 相当于C语言main函数的argv[0]
$1、$2... 这些称为位置参数(Positional Parameter),相当于C语言main函数的argv[1]、argv[2]...
$# 相当于C语言main函数的argc - 1,注意这里的#后面不表示注释
$@ 表示参数列表"$1" "$2" ...,例如可以用在for循环中的in后面。
$? 上一条命令的Exit Status
$$ 当前Shell的进程号
@@@@@@@@
位置参数可以用shift命令左移。
比如shift 3表示原来的$4现在变成$1,原来的$5现在变成$2等等,原来的$1、$2、$3丢弃,$0不移动。
不带参数的shift命令相当于shift 1
@@@@@@@@
注意函数体的左花括号{和后面的命令之间必须有空格或换行,
如果将最后一条命令和右花括号}写在同一行,命令末尾必须有;号。
用foo函数的时候才执行函数体中的命令。
注意Shell中的函数调用不写括号.
Shell脚本中的函数必须先定义后调用,
调用函数时可以传任意个参数,在函数内同样是用$0、$1、$2等变量来提取参数,函数中的位置参数相当于函数的局部变量,
改变这些变量并不会影响函数外面的$0、$1、$2等变量。函数中可以用return命令返回,如果return后面跟一个数字则表示函数的Exit Status。
Shell提供了一些用于调试脚本的选项,如下所示:
-n 读一遍脚本中的命令但不执行,用于检查脚本中的语法错误
-v 一边执行脚本,一边将执行过的脚本命令打印到标准错误输出
-x 提供跟踪执行信息,将执行的每一条命令和结果依次打印出来
在命令行提供参数
$ sh -x ./script.sh
二是在脚本开头提供参数
#! /bin/sh -x
第三种方法是在脚本中用set命令启用或禁用参数
#! /bin/sh
if [ -z "$1" ]; then
set -x
echo "ERROR: Insufficient Args."
exit 1
set +x
fi
set -x和set +x分别表示启用和禁用-x参数,这样可以只对脚本中的某一段进行跟踪调试
%%%%%%%%%%% 正则表达式 %%%%%%%%%%%%