什么是SHELL
SHELL为我们在用户和linux系统之间提供了一个交互界面。它读取我们的输入然后执行特定的程序。当程序执行的时候它还显示命令输出。因此SHELL被称作linux系统的命令解析器。shell的作用就是遵循一定的语法将输入的命令加以解释并传给系统。它是用户使用linux的桥梁。
登录Linux 系统时,将会看到像这样的提示符:#或$
您所看到的特殊的提示符可能看起来很不一样。它可能包含系统的主机名、当前的工作目录名,或者两者都有。但是不管这个特殊的提示符看起来像什么,有一件事是肯定的。打印出这个提示符的程序叫“shell”,极有可能您的特殊的shell 是一个叫bash 的程序。
几种流行的SHELL:
ash、bash、ksh、csh、zsh
[root@localhost ~ ]#echo $SHELL 显示系统当前使用的SHELL
[root@localhost ~ ]# chsh-l 列出系统所支持的shell
Bash 是“Bourne-again shell”的首字母缩写,它是大多数Linux 系统缺省的shell。shell 的任务是执行您的命令,使您能够与Linux 系统进行交互。当您输完命令,您可以通知shell 执行exit 或logout 命令,在此您将返回到登录提示符。
[root@localhost ~ ]# csh //直接进入csh中,这个shell被称为子shell
[root@localhost ~ ]# exit //退出这个shell
LINUX系统的组成
LINUX系统主要由两部分组成:工具 内核
工具就是能够被执行的程序,如who、date,工具指的是一个程序名字,而命令则是指程序和为了改变程序的行为而指定的参数。有时工具也叫作命令。
内核是linux系统的核心部分,它提供了访问计算机硬件的功能,同时进行系统调度和执行命令。当计算机断电的时候,内核和工具(程序)被存储在硬件存储介质上。
当计算机启动的时候,内核就从磁盘被加载到内存里,并且一直驻留在内存里,直到关机的时候。工具是以文件的形式存储在磁盘上的,只有在被请求的时候才加载到内存。例如执行“who”命令时内核就加载磁盘里存储的who命令到内存里。然后开始执行它。
Shell和命令who一样,也是存储在磁盘上的程序。他们之间的主要区别是,shell在你登录系统的时候就加载了,然后一直驻留在内存里,直到你退出系统。
看一个简单的shell程序
#Program date
#usageto ::show the date in this way (注释)
echo “Mr.$USER,Today is:”
echo date “+%B%d%A”
Shell特殊字符
Shell变量的名称中只能包含字母(a到z、A到Z),数字(0到9)和下划线(_)。此外变量名只能以字母或下划线开始。
Shell中引号分为三种:单引号,双引号和反引号
特殊字符用单引号括起来以后,会失去原来的意义,而只作为普通字符解释。
例:
[root@localhost ~ ]# echo ‘$binnary’
Shell特殊字符:
由双引号括起来的字符,除 $、\、`、“ 这几个字符仍是特殊字符并保留其特殊功能外,
其余字符仍作为普通字符对待。
$字符:就是用其后指定的变量的值来代替这个变量和$
例:
[root@localhost ~ ]# echo $PATH
\符号:是转义字符,它告诉shell不要对其后面的那个字符进行特殊处理,只当作普通字符。
例:
[root@localhost ~ ]# echo it’s good
[root@localhost ~ ]# echo it\’s good
`符号:叫做反引号,反引号括起来的字符串被shell解释为命令行,在执行时,shell首先执行该命令行,并以它的标准输出结果取代整个反引号。
[root@localhost ~ ]# echo `date`
输入/输出重定向和管道
[root@localhost ~ ]# ls *.doc >> d.doc
和程序的标准输出重定向一样,程序的错误输出也可以重新定向。使用符号2>(或追加符号2>>)表示对错误输出设备重定向。
[root@localhost ~ ]# ls /usr/tmp 2> err.file
还可以使用另一个输出重定向操作符(&>)将标准输出和错误输出同时送到同一文件中。
例:
[root@localhost ~ ]# ls/usr/tmp &> output.file
命令执行顺序
命令间隔符说明
; 用;间隔的各命令按顺序依次执行。
&& 前后命令的执行存在“逻辑与”关系,只有&&前面的命令执行成功后,它后面的命令才被执行。
|| 前后命令的执行存在“逻辑或”关系,只有||前面的命令执行失败后,它后面的命令才被执行。
Shell的执行方式
Shell的执行方式可以选择使用下面三种方法:
1、改文件的权限。
[root@localhost ~ ]# chmod 755 filename.sh
[root@localhost ~ ]#./filename.sh
2、直接使用sh命令
[root@localhost ~ ]# sh filename.sh
3、使用bash命令
[root@localhost ~ ]# bash filename.sh
[root@localhost ~ ]#vi hello.sh
#!/bin/bash
hello=“Hello! How are you?”
echo $hello
[root@localhost ~ ]# sh hello.sh
Hello ! How are you ?
declare
declare [-afir]
参数说明:
-a :定义为数组array
-f :定义为函数function
-i :定义为整数integer
-r :定义为只读
例:
[root@lcoalhost ~ ]# vi declare.sh
declare -i a=3
declare -i b=5
declare -i c=$a*$b
echo $c
[root@lcoalhost ~ ]#sh declare.sh
read
read:的功能就是读取键盘输入的值,并赋给变量
[root @test test]#vi read.sh
#!/bin/bash
read name
echo $name
[root @test test]# sh read.sh
test 这是键盘输入的内容
test 这是输出的内容
shell参数
1、 位置参数
由系统提供的参数称为位置参数。位置参数的值可以用$N得到,N是一个数字,如果为1,即$1.类似C语言中的数组,Linux会把输入的命令字符串分段并给每段进行标号,标号从0开始。第0号为程序名字,从1开始就表示传递给程序的参数。如$0表示程序的名字,$1表示传递给程序的第一个参数,以此类推。
例:
[root@localhost ~ ]# vi example.sh
echo $0
echo $1
echo $2
echo $3
[root@localhost ~ ]#sh example.sh a b c
example.sh
a
b
c
2、 内部参数
上述过程中的$0是一个内部变量,它是必须的,而$1则可有可无。和$0一样的内部变量还有以下几个。
$# ----传递给程序的总的参数数目
$? ----上一个代码或者shell程序在shell中退出的情况,如果正常退出则返回0,反之为非0值。
$* ----传递给程序的所有参数组成的字符串。
$@----程序的所有参数
变量表达式
test 表达式
表达式所代表的操作符有字符串操作符、数字操作符、逻辑操作符以及文件操作符。其中文件操作符是一种shell独特的操作符,因为shell里的变量都是字符串,为了达到对文件进行操作的目的,于是才提供了这样的一种操作符。
1、 字符串比较
作用:测试字符串是否相等、长度是否为零,字符串是否为NULL(注:bash区分零长度字符串和空字符串)
常用的字符穿操作符有:
= 比较两个字符串是否相同,同则为“是”!= 比较两个字符串是否相同,不同则为“是”
-n 比较字符串长度是否大于零,如果大于零则为“是”
-z 比较字符串的穿度是否等于零,如果等于则为“是”
2、 数字比较
这里区别于其他编程语言,test语句不使用>?类似的符号来表达大小的比较,而是用整数式来表示这些。
-eq 相等
-ge 大于等于
-le 小于等于
-ne 不等于
-gt 大于
-lt 小于
3、 逻辑操作! 反:与一个逻辑值相反的逻辑值
-a 与(and):两个逻辑值为“是”返回值才为“是”,反之为“否”
-o 或(or):两个逻辑值有一个为“是”,返回值就为“是”
4、 文件操作
文件测试表达式通常是为了测试文件的信息,一般由脚本来决定文件是否应该备份、复制或删除。由于test关于文件的操作符有很多,我们只列举一些常用的。
-d 对象存在且为目录返回值为“是”
-f 对象存在且为文件返回值为“是”
-L 对象存在且为符号连接返回值为“是”
-r 对象存在且可读则返回值为“是”
-s 对象存在且长度非零则返回值为“是”
-w 对象存在且可写则返回值为“是”
-x 对象存在且可执行则返回值为“是”
下面我们利用内部变量和位置参数编写一个名为del的简单删除程序:
if test $# -eq 0
then
echo “Please specify a file!”
else
gzip $1 //先对文件进行压缩
mv $1.gz $HOME/dustbin //移动到回收站
echo “File $1 is deleted !”
fi
算式运算
$((exp))
exp:表达式,可以使用如下运算符:
/ :除,并返回结果
* :乘
-:减
+ :加
() :圆括号里的运算符优先于其他预算符
[root@localhost ~ ]# echo $((5*6))
[root@localhost ~ ]# echo $((((5+3*2)-4)/2))
除时,如果结果有小数,则截取小数部分
expr
expr是用来加减变量$x
expr的操作符
+:加
-:减
\*:乘
/:除
%:取余(取模)
注意:操作符两边有空格
expr 1 + 6 / 5
流控制
在一个shell脚本中的命令执行顺序称作脚本的流。大多数脚本会根据一个或多个条件来改变它们的流。
流控制命令:能让脚本的流根据条件而改变的命令称为条件流控制命令。
Shell语句中两种主要的流控制语句:
If语句
Case语句
if语句
if语句根据给出的条件是否为真来执行相应的动作。代码返回0表示真,非0为假。
if语句语法如下:
if list1
then
list2
elif list3
then
list4
else
list5
fi
if示例
条件判断一:if then fi的方式
执行脚本if.sh,当输入y是输出“script is running”,当输入除y以外的任何字符时输出“STOP!”
·[root@localhost ~ ]# vi iftest.sh
echo "Press y to continue"
read yn
if [ "$yn" = "y" ]; then
echo "script is running..."
else
echo "STOP!"
fi
[root@localhost ~ ]#sh iftest.sh
if练习
编写脚本port.sh,执行脚本后显示系统的www、ftp、ssh这些服务是否开启。
提示:在脚本中使用nmap、grep命令。
case语句
case语句是shell中流控制的第二种方式,语法如下:
case word in
pattern1)
list1;;
pattern2)
list2 ;;
…
patternN)
listN;;
esac
;;类似C语言中的break指令
字符串变量word与从pattern1到patternN的所有模式一一比较。当找到一个匹配模式后就执行跟在匹配模式后的list
当一个list执行完了,专用命令;;表明流应该跳转到case语句的最后。;;类似C语言中的break指令。如果找不到匹配的模式,case语句就不做任何动作。
case练习
建立脚本case.sh,当执行时,要求我们在键盘输入适当的值,当输入正确时并打印出,当输入错误时会提示你,应该输入哪些值。
[root@localhost ~ ]# vi case.sh
#!/bin/bash
echo "press your chioceone,two,three"
read number
case $number in
one)
echo "your choice is one";;
two)
echo "your choice is two";;
three)
echo "your choice is three";;
*)
echo "Usage {one|two|three}"
esac
[root@localhost ~ ]# sh case.sh
for循环
for循环使你对列表中的每一项重复执行一系列命令。
语法格式:
for name in word1 world2 …worldN
do
list
done
name 是变量名,word1到wordN是一系列由空格分隔的字符序列(单词)。每次执行for循环时,变量name的值就被设为单词列表(word1到wordN)中的一个单词。for循环执行的次数取决于指定的word的个数。
在for循环的每次反复中,都会执行list中指定的命令。
也可以写成如下格式:
for name in word1 wrold2 …wordN; do list ;done
for循环练习
自己看一下下面的例子,会出现什么样的效果:
[root@localhost ~ ]# vi fortest.sh
#!/bin/bash
LIST="Tom Jony Mary Geoge"
for i in $LIST
do
echo $i
done
[root@localhost ~ ]# sh fortest.sh
while循环
while循环使你能够重复执行一系列的命令,直到某种条件发生。
基本语法:
while cmd
do
list
done
cmd是一个单一的命令,list是一个或多个命令的列表。
1.执行cmd
2.如果cmd的退出状态为非0,则退出循环
3.如果cmd的退出状态为0,则执行list
4.当list结束时,回到第一步
可以写成:
while cmd ;do list ;done
while循环练习
输出10以内的数字
[root@localhost ~ ]#vi whiletest.sh
x=0
while [ $x –lt10 ]
do
echo $x
x=`expr $x + 1`
done
[root@localhost ~ ]#sh whiletest.sh
嵌套while循环
x=0
while [ “$x” –lt 10 ];
do
y=“$x”
while [ “$y” –ge 0 ];
do
printf“$y”
y=`expr $y – 1`
done
echo
x=`expr $x + 1`
done
批量添加用户
#!/bin/bash
sum=0
while [ $sum –lt 10 ]
do
sum=`expr $sum + 1`
useradd user $sum
echo “123456" | passwd –stdin user$sum
done
练习
请按上面的例子写一个添加指定数目,指定用户的程序。
until循环
while循环适合于当某种条件为真时执行一系列命令,而until循环执行一系列命令,直到条件为真时才退出循环。
语法如下:
until cmd
do
list
done
cmd是一条单独指令,而list是一条或多条命令的集合。Until的执行流程和while类似。
1.执行cmd
2.如果cmd的退出状态为非0,则退出until循环
3.如果cmd的退出状态为0,则执行list
4.当list执行完毕,返回步骤1
select循环
select循环提供了一种简单的方式来创建一种用户可选择的有限菜单。当你需要用户从一个选项列表中选择一项或多项时非常有用。
语法:
select name in word1 word2 …wordN
do
list
done
name是变量名
执行流程:
1.list1中的每一项都跟随着一个数字一起显示
2.显示一个命令提示符,通常是#?
3.当用户输入一个值时,$REPLY被设置那个值
4.进行了有效的选择后,执行list2
5.如果list2没有使用循环控制机制(例如break)来退出select循环,过程重新从步骤1开
始。
select练习
#!/bin/bash
select program in ‘ls–F’ ‘pwd’ ‘date’ ‘df–v’
do
$program
done
函数
[function]函数名( )
{
命令表
}
其中,关键字function可以缺省。
函数应先定义,后使用。调用函数时,直接利用函数名,如showfile,不必带圆括号,就像一般命令那样使用。Shell脚本与函数间的参数传递可利用位置参数和变量直接传递。变量的值可以由Shell脚本传递给被调用的函数,而函数中所用的位置参数$1、$2,等对应于函数调用语句中的实参,这一点是与普通命令不同的。
函数的示例
#func is a function name
# it echos the values of variables and arguments
func( )
{
echo "Let's begin now. "
echo $a $b $c
echo $1 $2 $3
echo "The end. "
}
a=" Working directory "
b="is"
c=`pwd`
func Welcome You Byby
echo "Today is ` date ` "
Shell中的函数把若干命令集合在一起,通过一个函数名加以调用。如果需要,还可被多次调用。执行函数并不创建新的进程,是通过Shell进程执行。
通常,函数中的最后一个命令执行之后,就退出被调函数。也可利用return命令立即退出函数,其语法格式是:
return [ n ]
其中,n值是退出函数时的退出值(退出状态),即$?的值。当n值缺省时,则退出值是最后一个命令执行后的退回值。
阅读(1203) | 评论(1) | 转发(0) |