1. shell文件第一行#! /bin/sh
的作用
用来表示此shell脚本由什么程序去执行;若是/bin/sh
,则使用bash去执行脚本;也可以是/bin/rm
、/bin/more
、/bin/cat
等等;都会达到这些命令的作用;删除脚本、读出脚本内容等。
2. Shell脚本执行流程
- 当执行脚本时,会fork一条和父Shell一模一样的子shell;因此,在子shell中的操作不会影响到父Shell的环境。
- 可以使用source xx.sh; 这样不会创建子shell,会直接使用父shell的环境。
3. export
export是修改当前shell进程中的环境变量;对于父shell不会产生影响。有效期:维持到当前Shell结束的时候,并不会持久化。
若要export的环境变量持久化,可以设置在持久化文件中
启动文件 | 描述 |
---|
/etc/profile | 系统范围的默认值,大部分用来设置环境(所有由sh衍生出来的shell都适用) |
/etc/bashrc | 特定的Bash的,系统范围函数与别名 |
$HOME/.bash_profile | 用户定义的,环境默认设置,在每个用户的home目录下都可以找到 |
$HOME/.bashrc | 用户定义的Bash初始化文件,可以在每个用户的home目录下找到(本地副本保存在/etc/bashrc);只有交互式的shell和用户脚本才会读取这个文件; |
$HOME/.bash_logout | 登出文件、用户定义的指令文件,可以在每个用户的home目录下找到;在登出shell的时候,这个文件中的命令就会得到执行。 |
4. Shell通配符
通配符 | 描述 |
---|
* | 匹配0或者多个字符 |
? | 匹配任意单个字符(不含0个字符) |
[list] | 匹配[list]中任意单个字符 |
[!list] | 匹配除list中的任意单个字符 |
5. Shell引号
引号 | 描述 |
---|
" " | 会把引号的内容当做整体来看待,允许通过$符号引用其他的变量值 |
’ ’ | 会把引号的内容当做整体来看待,所有的特殊字符都会当做普通字符看待;禁止引用其它变量值 |
反撇号(``) | 和$() 一样,引号和括号里面的命令优先执行,如果存在嵌套使用,反撇号不能使用。需要使用$() ; |
6. Shell常用参数引用
引用参数 | 描述 |
---|
0, 1, 2 | 位置参数。 传入shell脚本的参数;参数0为shell脚本的名称 |
* | 以一个单字符串显示所有向脚本传递的参数,与位置变量不同,此选项可超过9个 |
@ | 从参数1开始,显示所有向脚本传递的参数。可以通过$1、$2 分别获取参数1,2的值。 |
# | 参数数量(不包含参数0) |
$ | 脚本运行的当前进程ID号 |
! | 后台运行的最后一个进程ID号 |
? | 显示最后命令的退出状态,0表示没有错误,其它值表示有错误 |
- | 显示shell使用的当前选项,与set命令功能相同 |
7. Expr
- 判断变量是否为数字;原理:当expr 非整数的变量 + 整数时,会报错。通过$?获取返回值。
1. expr $a + 1 &>/dev/null
2. echo $?
- expr 参数1 操作符 参数2: 参数和操作符之间需要空格分开,不然,会被当成字符串处理。
8.小技术点
- 求字符串长度
1. ${#my_str}
2. expr length "${my_str}"
3. echo $my_str |wc -L
4. echo $my_str |awk '{print length}'
- 使用bash命令,调试shell脚本
1. bash -n wc.sh
2. bash -v wc.sh
3. bash -x wc.sh
9. 小案列
- N乘法表:根据输入的数字,得到对应的乘法表。
#! /bin/sh
expr $1 + 1 &>/dev/null
params_result=$?
if [ $params_result -ne 0 ]; then
echo "$1 isn't number."
exit 1
fi
declare -i max=$1
declare -i outer=1
while [ $outer -le $max ]
do
declare -i inner=1
while [ $inner -le $outer ]
do
printf "%d * %d = $((inner * outer))\t " $outer $inner
inner=$inner+1
done
printf "\n"
outer=$outer+1
done