应用程序优先将指令发给shell,由shell解释器来翻译并执行。
如果脚本第一行未使用#!指定shell,则系统使用当前环境shell运行脚本。
shell是弱类型的脚本语言。shell定义的变量,数据类型默认都是字符串类型,不用主动声明。
强类型的脚本语音,在定义变量时必须指定数据类型。
/etc/shells文件中记录了当前系统支持的shell类型。
history -c 清除历史记录
history -r 恢复历史记录
删除~/.bash_history文件可以清除所有历史记录freebsd的csh历史记录文件是~/.history。
!加history序号可重复序号对应的命令。!!执行上一个命令。
变量赋值时,变量和值与等号之间不得有空格,name="ABC"是对的,name = "ABC"是错的。
变量名只能包含数字、字母、下划线,不能以数字开头,不能用标点符号,严格区分大小写。
对变量的调用标准方法是用花括号将变量括起来,比如echo ${name},而echo $name是简写。
本地变量的作用域仅针对当前shell。
环境变量的作用域为全局。
单引号不识别特殊语法
双引号能识别特殊语法
echo $?,返回0表示上一个命令正确执行,若执行不正确,则返回其他数值(1-255)。
使用bash执行一个sh脚本,脚本中的变量仅影响子shell中的值,使用source执行一个脚本,则脚本中的命令被视为是在父shell中执行。
例如:
当前shell中:name=abc。
脚本test.sh中内容为:
name=ABC
运行bash test.sh,然后echo $name,返回abc;运行source test.sh,然后echo $name,返回ABC。
反引号括起来的命令,执行后返回改命令的执行结果。
- set
输出所有变量,包括全局变量、局部变量
- env
只显示全局变量
- declare
输出所有变量,如同set
- export
显示和设置环境变量值
- unset 变量名
删除变量或函数
环境变量文件加载顺序:
- ssh登录linux后,系统启动一个bash shell,bash会读取若干个系统环境文件,检查环境变量设置
- /etc/profile:全局环境变量文件,为系统的每个用户设置环境变量,当用户第一次登录时执行该文件,并从/etc/profile.d目录的配置文件中搜集shell的设置
- 然后读取/etc/profile.d目录下的脚本,有系统诸多脚本,也放入自定义需要登录加载的脚本,便于用于登录后立即运行的脚本
- 运行$HOME/.bash_profiel(用户环境变量文件)
- 运行$HOME/.bashrc
......
- 运行/etc/bashrc
一行执行多个命令(符号两边是否有空格不影响结果):
- cmd1 ; cmd2 ; cmd3
依次执行以上命令,无论是否有命令失败都继续执行下一个命令
- cmd1 && cmd2 && cmd3
依次执行以上命令,如果有命令失败则终止
- cmd1 || cmd2 || cmd3
依次执行以上命令,如果有命令成功则终止
特殊参数变量:
- $0
显示当前shell名称
- $n
获取shell脚本的第n个参数,n在1~9之间。大于9需要用花括号括起来,例如${10}
- $#
获取执行的shell脚本后面的参数总个数
- $*
获取shell脚本所有参数,不加引号等同于$@,加引号"$*"接收所有参数为单个字符串,"$1 $2..."
- $@
不加引号效果同上,加引号接收所有参数为独立字符串,如"$1" "$2" "$3"...空格保留
实列:
[lidapeng@X61s ~]$ cat 1.sh
echo $#
echo "$*"
echo "$@"
echo "print each param from \"\$*\""
for var in "$*"
do
echo "$var"
done
echo "print each param from \"\$@\""
for var in "$@"
do
echo "$var"
done
[lidapeng@X61s ~]$bash 1.sh a b c
3
a b c
a b c
print each param from "$*"
a b c
print each param from "$@"
a
b
c
特殊状态变量:
- $?
上一次命令执行状态返回值,0表示正确,其他值表示失败
- $$
当前shell脚本的进程号
- $!
上一次后台进程的PID
- $_
获取上次命令的最后一个参数
实例:
[lidapeng@X61s ~]$ cat 2.sh
[ $# -ne 2 ] && { -ne 表示不等于
echo "must be two args"
exit 119 终止程序,并返回状态码119,用于echo $?返回值
}
echo ok
echo "当前脚本的id是: $$"
[lidapeng@X61s ~]$ bash 2.sh 1 2 3
must be two args
[lidapeng@X61s ~]$ bash 2.sh 1 2
ok
当前脚本的id是:46854
[lidapeng@X61s ~]$ echo $_
2
[lidapeng@X61s ~]$ bash 2.sh 1
must be two args
[lidapeng@X61s ~]$ echo $?
119
[lidapeng@X61s ~]$ echo $_
119
用$!获取上一次后台执行的程序的PID,实例:
[lidapeng@X61s ~]$ nohup ping baidu.com & 1> /dev/null 在后台ping baidu.com
[1] 41609
[lidapeng@X61s ~]$ appending output to nohup.out
[lidapeng@X61s ~]$ ps -ef |grep baidu.com 查看ping的PID
41609 0 SC 0:00.01 ping baidu.com
42588 0 S+ 0:00.00 grep baidu.com
[lidapeng@X61s ~]$ echo $! 查看上一次在后台执行的命令的PID,与ps命令结果一致
41609
[lidapeng@X61s ~]$ kill 41609 杀掉该进程
[lidapeng@X61s ~]$ ps -ef |grep baidu.com
43435 0 S+ 0:00.00 grep baidu.com
[1]+ 终止 nohup ping baidu.com
[lidapeng@X61s ~]$ ps -ef |grep baidu.com
43679 0 S+ 0:00.00 grep baidu.com