shell 脚本文件一般由三部分组成:解释器、命令代码、注释。
[root@server ~]# cat test #!/bin/bash <<注释 这里是多行注释 注释 echo 'hello world' # 这里是单行注释 echo valar morghulis [root@server ~]# sh test hello world valar morghulis
脚本第一行就是解释器,这一行的功能是指定脚本要使用的解释器,linux系统会通过这个信息来判断要使用哪种解释器来解释整个脚本的命令代码。比如这个例子中使用的是#!/bin/bash,它的第一位字符是井号'#',所以不会被当成命令执行。
接下来是两种格式的注释,<<开头并加上任意字符的格式就是多行注释,多行注释的结尾应该与开头<<后边的字符一致。单行注释以井号'#'开头。注释的功能是解释说明代码实现的功能,而不会真正执行。
接下来占比重最大的一部分就是命令代码,命令代码使脚本实现各种各样的功能。只要语法正确,开发者可以尽情的发挥。
1.1 shell 中规定变量只能由大小写字母、数字和下划线(_)组成,且开头不能是数字。下边是一些合法变量名:bob、team_1、Group1、_temp。
1.2 变量的定义方式是 变量名=变量值:例如 bob=15,team_1="Beijing"
1.3 变量的取消方式是 unset 变量名
1.4 变量的使用方式是在变量名之前加上$,比如:
[root@server ~]# cat test #!/bin/bash Bob=15 echo Bob今年$Bob岁。 [root@server ~]# sh test Bob今年15岁。
但是如果在变量后边紧跟其他字符,会使 shell 错误判断变量名使功能无法实现,比如:
[root@server ~]# cat test #!/bin/bash prefix=cl echo ${prefix}assmate echo 1echo $prefixassroome cho 2 [root@server ~]# sh test classmate 1 2
这里shell不知道$prefixassroom的值,因为并没有定义,所以没有输出。正确的使用方式是在变量前后用大括号括起来,如上所示,classmate可以正确输出。
1.5 只读变量的定义方式是 readonly 变量名=变量值 或 readonly 变量名
[root@server ~]# cat test #!/bin/bash readonly var=Jon echo ${var} var=Ron echo ${var} [root@server ~]# sh test Jon test:行4: var: 只读变量
常用的环境变量如下表所示:可以用 set 或 env 命令查看
$HOME | 当前用户的家目录 |
$USER | 当前用户名 |
$UID | 当前用户ID |
$PATH | 搜索命令的路径 |
$PWD | 当前工作目录 |
$SHELL | 当前系统的shell |
$RANDOM | 返回一个随机数 |
定义环境变量的方式有两种,临时定义可以用:
MYVAL=999 export MYVAL
永久定义环境变量的方式是在/etc/profile 或 ~/.bashrc 中添加以上配置后对配置文件执行 source 命令。
下边是特殊状态变量,在脚本中可以直接使用:
$0 | 当前脚本名 |
$$ | 当前进程号 |
$1-9 | 传入脚本的参数,$1是第一个参数,如果要返回10以上的位置参数,使用大括号:${10} |
$# | 传入脚本的参数的个数 |
$* | 传入脚本的所有参数,作为一个整体。 |
$@ | 传入脚本的所有参数,作为独立的个体。 |
$? | 上一条命令的退出状态码。 |
$! | 后台运行的最后一个进程的 ID 号。 |
[root@server ~]# sh test 1 2 3 4 5 6 7 8 9 10 $HOME 是 /root $USER 是 root $UID 是 0 $PATH 是 /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin $PWD 是 /root $SHELL 是 /bin/bash $RANDOM 是 19621 $0 是 test $$ 是 31747 $1 是 1 $2 是 2 $3 是 3 $4 是 4 $5 是 5 $6 是 6 $7 是 7 $8 是 8 $9 是 9 ${10} 是 10 $# 是 10 $* 是 1 2 3 4 5 6 7 8 9 10 $@ 是 1 2 3 4 5 6 7 8 9 10 $? 是 0 $! 是
(1)$变量名、"$变量名"、${变量名}、"${变量名}" 功能一致
[root@server ~]# cat aaa.sh #!/bin/bash name="David" echo $name echo "$name" echo ${name} echo "${name}"
执行结果:
[root@server ~]# sh aaa.sh David David David David
(2)如果变量名被单引号''引起来,变量名将被看做是普通字符串:
[root@server ~]# name="David" [root@server ~]# echo "$name" David [root@server ~]# echo '$name' $name
(3)反引号``或$()引起来的命令的结果可以赋值给变量,推荐使用$():
[root@server ~]# echo "当前进程数为`ps -ef | wc -l`" 当前进程数为87 [root@server ~]# echo "当前进程数为$(ps -ef | wc -l)" 当前进程数为87
本文介绍了两部分知识,第一部分是 shell 脚本的结构,由三部分组成:解释器、命令代码、注释。第二部分是变量的定义与使用,分别介绍了用户自定义变量和系统预设变量。