用shell编写的程序称为shell程序。
通常由一段Linux命令、Shell命令、控制语句以及注释语句构成
Shell 脚本是纯文本文件,可以使用任何文本编辑器编写
Shell 脚本通常是以 .sh 作为后缀名
输入输出
read/echo或printf
条件测试
整数测试、逻辑测试、字符串测试
控制语句
条件/循环/分支/
函数
declare/export/eval/trap等
--------------------------------------
Shell程序的第一行
Linux Shell的种类很多,目前流行的Shell包括ash、bash、ksh、csh、zsh等,用户可以通过查看/etc/shells 文件中的内容来查看自己主机中当前有哪些种类的Shell,命令如下(下面是在笔者Linux 主机中查看信息的结果):
- # cat /etc/shells
- /bin/sh
- /bin/bash
- /sbin/nologin
- /bin/bash2
- /bin/ash
- /bin/bsh
- /bin/tcsh
- /bin/csh
使用下面的命令来查看Linux 当前正在使用的Shell 类型:
- # echo $SHELL
$SHELL是一个环境变量,它记录了Linux 当前用户所使用的Shell类型。用户可以通过直接输入各种Shell的二进制文件名(因为这些二进制文件本身是可以被执行的),来进入到该Shell下,比如进入csh可以直接输入:
- # /bin/csh
这个命令为用户又启动了一个Shell,这个Shell在最初登录的那个Shell之后,称为下级的Shell或子Shell。使用命令:
- # exit
可以退出这个子Shell。
使用不同的Shell 的原因在于它们各自都有自己不同的特点,下面简单介绍Linux 下各种不同的Shell类型的特点。
1. ash
ash Shell是由Kenneth Almquist编写的,是Linux 中占用系统资源最少的一个小Shell,它只包含24个内部命令,因而使用起来很不方便。
2. bash
bash是Linux系统默认使用的Shell,它由Brian Fox 和Chet Ramey共同完成,是BourneAgain Shell的缩写,内部命令一共有40 个。Linux 使用它作为默认的Shell是因为它具有以下特色:
可以使用类似DOS下面的doskey的功能,用上下方向键查阅和快速输入并修改命令。
自动通过查找匹配的方式,给出以某字串开头的命令。
包含了自身的帮助功能,你只要在提示符下面键入help就可以得到相关的帮助信息。
3. ksh
ksh是Korn Shell的缩写,由Eric Gisin编写,共有42 条内部命令。该Shell最大的优点是几乎和商业发行版的ksh 完全相容,这样就可以在不用花钱购买商业版本的情况下尝试商业版本的性能了。
4. csh
csh 是Linux 比较大的内核,它由以William Joy 为代表的共计47 位作者编成,共有52个内部命令。该Shell其实是指向/bin/tcsh这样的一个Shell,也就是说,csh其实就是tcsh。
5. zch
zch是Linux 最大的Shell之一,由Paul Falstad完成,共有84 个内部命令。如果只是一般的用途,没有必要安装这样的Shell。
--------------------------------------变量概述
本地变量只在创建它们的 shell 程序中可用。而环境变量则在Shell中的所有用户进程中可用,通常也称为全局变量
[root@px ~]# var=pjm
[root@px ~]# echo $var
pjm
[root@px ~]# echo ${var}你好
pjm你好
[root@px ~]# set| grep "pjm"
[root@px ~]# unset var
[root@px ~]# set|grep "pjm"
[root@px ~]# echo $?
1
[root@px ~]#
--------------------------------------
环境变量和只读变量
定义变量
定义变量时,变量名不加美元符号($),如:
- variableName="value"
- 首个字符必须为字母(a-z,A-Z)。
- 中间不能有空格,可以使用下划线(_)。
- 不能使用标点符号。
- 不能使用bash里的关键字(可用help命令查看保留关键字)。
变量定义举例:
- myUrl="http://see.xidian.edu.cn/cpp/linux/"
- myNum=100
使用变量
使用一个定义过的变量,只要在变量名前面加美元符号($)即可,如:
- your_name="mozhiyan"
- echo $your_name
- echo ${your_name}
- for skill in Ada Coffe Action Java
- do
- echo "I am good at ${skill}Script"
- done
重新定义变量
已定义的变量,可以被重新定义,如:
- myUrl="http://see.xidian.edu.cn/cpp/linux/"
- echo ${myUrl}
- myUrl="http://see.ccccc.edu.cn/cpp/shell/"
- echo ${myUrl}
只读变量
使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。下面的例子尝试更改只读变量,结果报错:
- #!/bin/bash
- myUrl="http://see.xidian.edu.cn/cpp/shell/"
- readonly myUrl
- myUrl="http://see.xidian.edu.cn/cpp/danpianji/"
[root@xx shell]# readonly var=pjm [root@xx shell]# echo ${var} pjm [root@xx shell]# var=pjm2222 -bash: var: readonly variable [root@xx shell]#
/bin/sh: NAME: This variable is read only.
删除变量
使用 unset 命令可以删除变量。语法:
- unset variable_name
举个例子:
- #!/bin/sh
- myUrl="http://see.xidian.edu.cn/cpp/u/xitong/"
- unset myUrl
- echo $myUrl
变量类型
运行shell时,会同时存在三种变量:1) 局部变量
局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。(set)2) 环境变量
所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。(env)3) shell变量
shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行位置参量(命令行参数)
$0 | 当前脚本的文件名 (形如 ./07testfor.sh ) |
$1-$9 | 第 1 个到第9 个位置参量 |
${10} | 第 10 个位置参量,类似地,有${11} , ... |
$# | 位置参量的个数 ($#) |
$* | 以单字符串显示所有位置参量 ($*) |
$@ | 未加双引号时与 $* 含义相同,加双引号时有区别 |
$$ | 脚本运行的当前进程号 |
$! | 最后一个后台运行的进程的进程号 |
$? | 显示前面最后一个命令的退出状态。 |
#例1:shell_test.sh
echo “the count of parameters:$#”
echo “first param=$1”
echo “second param=$2”
echo “params’ string=$*”
./shell_test.sh This is Peter
数组
数组个数: ${#arr[*]}
所有元素: ${arr[*]}
arr[0]=chemical
[root@p shell]# arr=(math english chinese)
[root@p shell]# echo ${arr[0]}
math
[root@p shell]# echo ${arr[1]}
english
[root@pa shell]# echo ${arr[2]}
chinese
[root@p shell]# echo ${arr[3]}
[root@p shell]# echo ${arr[*]}
math english chinese
[root@p shell]# echo ${#arr[*]}
3
[root@p shell]# arr[0]=xxxxx
[root@p shell]# echo ${arr[*]}
xxxxx english chinese
[root@p shell]# arr[4]=xxxxx2222
[root@p shell]# echo ${arr[*]}
xxxxx english chinese xxxxx2222
[root@p shell]# echo ${#arr[*]}
4
[root@p shell]# arr[10]=xxxxx101010
[root@p shell]# echo ${arr[*]}
xxxxx english chinese xxxxx2222 xxxxx101010
[root@panjinming shell]# echo ${#arr[*]}
5
[root@panjinming shell]# </span>