shebang
以 #!
开头的文件,程序会在执行时会调用/bin/sh
,bash的解释器。
默认使用/bin/sh
执行。
也可指定使用解释器,如: /bin/bash/python hello.py
执行脚本的方式
bash script.sh
或者sh script.sh
,文件本身没有执行权限的方法。- 使用绝对路径或相对路径,需要文件有执行权限。
shell变量
shell脚本中,变量与值之间不能有空格。
变量命名规则:
- 数字、字母、下划线
- 不能以数字开头
- 严格区分大小写
环境变量:也称全局变量。
特殊变量:$?,若返回0.则上一条命令执行成功;若返回1-255则不成功。
单引号变量:不识别特殊语法。
双引号变量:能识别特殊语法。
例:
[root@localhost ~]# name=wukong
[root@localhost ~]# name1='${name}'
[root@localhost ~]# name2="${$name}"
[root@localhost ~]# echo ${name}
wukong
[root@localhost ~]# echo ${name1}
${name}
[root@localhost ~]# echo ${name2}
wukong
关于sh、
- 每次调用bash/sh解释器执行脚本,都会开启一个子shell,因此不会保留当前shell变量,通过pstree查看进程树。
- 调用source或者点符号,在当前shell环境执行脚本,变量保存。
linux中,反引号中的命令执行结果讲会被保留。
文件~/.bash_prpfile
--> 用户个人配置文件。
环境变量加载顺序
- ssh登录linux,启动一个bash shell
- 加载/etc/profile --> 全局环境变量:为系统中每一个用户设置环境信息。
- 读取/etc/profile.d目录下脚本。有系统诸多脚本,也有自定义需要登录加载的脚本。
- 运行$HOME/.bash <-- 用户环境变量文件
- 运行$HOME/.bashrc
- 运行/etc/bashrc
特殊变量
$0
:获取shell脚本文件名。
$1、$2……$n
:获取脚本的第1、2……n个参数,大于9则需要写大括号,如:${10}。
$#
:接受到的参数个数。
$*
:接收所有参数合并为一个字符串。
$@
:不加引号,效果如上。加引号,接收所以参数为独立字符串,空格保留。
$和$@的区别如下:
[root@localhost bin]# sh special1_difference.sh welcome to Jiaxing
print each param from "$*"
welcome to Jiaxing
print each param from "$@"
welcome
to
Jiaxing
special1_difference.sh脚本代码如下:
echo "print each param from \"\$*\""
for var in "$*"
do
echo "${var}"
done
echo "print each param from \"\$@\""
for var in "$@"
do
echo "${var}"
done
特殊状态变量
$?
:上次命令状态结果返回,0执行成功,非0失败。
$$
当前shell脚本的进程号。
$!
上次后台进程的PID。
$_
取得上次命令传入的最后一个参数(字面意思)。