shell简述
shell功能
shell主要有两个功能,一个是命令解释器;另一个是作为高级程序设计语言可以编出代码简洁、功能强大的程序。
shell作为命令解释器的具体功能:它接收用户输入的命令,进行分析,创建子进程,由子进程实现命令所规定的功能,等子进程终止后,发出提示符。
shell作为一种高级程序设计语言,它几乎有高级语言所需要的所有元素,包括变量、关键字、各种控制语句等,还拥有自己的语法结构。shell有自己的编程语言,用于对命令的编辑,它允许用户编写由shell命令组成的程序
shell脚本的执行
-
脚本名作为shell参数的执行方法
sh script-name
或者
bash script-name
这种方法是脚本文件本身没有可执行权限时常用的方法,或者脚本文件开头没有指定解释器时需要使用的方法
-
修改为可执行权限的执行方法
脚本在建立时,其访问权限和普通的文本文件一样,没有可执行的权限。先用 chmod 语句将脚本文件的可执行权限加上(文件执行权限为 x),然后在终端直接输入脚本名称的绝对路径或者相对路径就可以
例如
chmod a+x mytest ./mytest
-
source 或者 “.” 命令
基本语法格式如下:
source script-name
#或者
. script-name
第一种和第二种方法都是在当前shell中新建一个子shell,在子shell中执行脚本语句,而source或者“.”(注意:“.”后边要加空格)的功能是直接在当前shell中读入脚本并执行脚本语句,而不是产生一个子shell来执行文件中的命令。
shell中的变量
shell常见修改和查看环境变量的命令
命令 | 说明 |
---|---|
echo | 显示某个环境变量值 |
export | 设置一个新的环境变量 |
env | 显示所有环境变量 |
set | 显示本地定义的shell变量 |
unset | 清除环境变量 |
readonly | 设置只读环境变量 |
shell的系统变量
系统变量 | 说明 |
---|---|
$0 | shell程序名 |
$1-$9 | 第1~9个命令行参数的值 |
$* | 传递给脚本的所有参数,全部参数合为一个字符串 |
$# | 传递给脚本的参数个数 |
$$ | 当前进程的进程ID |
$? | 最后执行的一条命令的退出状态,返回值为0则成功;非0则失败 |
$! | 在后台运行的最后一个进程的进程ID |
当命令行参数的个数大于 9 个时,可以使用shift指令将参数左移,获取第10个以后的参数。shift指令将所有参数左移1位,$2的值覆盖$1,$3的值覆盖$2,以此类推,$9的值被第10个参数覆盖。也可以使用 shift n 指令将所有的参数一次性向左移n位
例:
[root@localhost~]#cat exam
#!/bin/bash
#exam:shell script to demonstrate the shift command
echo $0 $1 $2 $3 $4 $5 $6 $7 $8 $9
shift
echo $0 $1 $2 $3 $4 $5 $6 $7 $8 $9
shift 4
echo $0 $1 $2 $3 $4 $5 $6 $7 $8 $9
#end
[root@localhost~]#./exam A B C D E F G H I J K
exam A B C D E F G H I
exam B C D E F G H I J
exam F G H I J K
shell的用户自定义变量
用户自定义变量在shell脚本中使用,它们拥有临时的存储空间,在程序执行过程中其值可以改变,这些变量可以设置为只读,也可以被传递给定义它们的shell脚本中的命令。
用户自定义的变量shell变量名是由字母或下划线开头的字母、数字和下划线序列,并且大小写字母意义不同。使用等号将赋值给用户变量(在变量、等号和值之间不能出现空格)
(1)字符串赋值。其语法格式如下:
变量名=字符串
在程序中使用变量值时,要在变量名前边加上 “$”。这个符号告诉shell,要取出其后变量的值(“=”两边不能有空格)
例:用 echo命令显示变量值
[root@localhost~]#mydir=/home/a
[root@localhost~]#echo $mydir
/home/a
[root@localhost~]##echo mydir
mydir
(2)当赋值给变量的值含有空格、制表符或者换行符时,要用双引号把这个字符串引起来
(3)在一个赋值语句中可以出现多个赋值,变量值可以迭代进行
例如: A=$b B=$C C=“Hello World”
相当于依次执行 A=$B,B=$C,C="Hello World"三条赋值语句
(4)变量值可以作为某个字符串中的一部分
例子:字符串引用实例
[root@localhost~]#s=world
[root@localhost~]#echo Hello&s
Helloworld
shell中变量的数学运算
shell中的变量都是字符串类型的,变量之间如需进行算数运算,必须使用expr 和 let 命令实现。shell 中支持常见的加(+)减(-)乘(\ *)除(/)取模(%)运算,需要注意的时,乘法的运算符是 \*,即转义字符 \ 和 * 放在一起表示乘法,这是因为shell中将 " * "默认为通配符使用
- expr命令
若要在shell脚本中获取expr命令的计算结果,需要将 expr 命令用倒引号(Esc下边的键)(" ` ")括起来[root@localhost~]#a=2 [root@localhost~]#expr 8 + $a 10 [root@localhost~]#expr 6 * $a expr:语法错误 [root@localhost~]#expr 6 \* $a 12
例:[root@localhost~]#cat exam a=5 b=`expr 3 + $a` echo "b=$b" exit 0 [root@localhost~]#sh exam b=8
- let命令
let命令可以进行算数运算,将算数表达式跟在 let 命令后边就可以实现数值的运算,其使用格式如下:[root@localhost~]#b=10 [root@localhost~]#let c=5+$b [root@localhost~]#echo $c 15