`
zpball
  • 浏览: 894477 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

shell入门基础

阅读更多
代码:--------------------------------------------------------------------------------

1.建立和运行shell程序
什么是shell程序呢? 简单的说shell程序就是一个包含若干行
shell或者linux命令的文件.
象编写高级语言的程序一样,编写一个shell程序需要一个文本编辑器.如VI等.
在文本编辑环境下,依据shell的语法规则,输入一些shell/linux命令行,形成一个完整
的程序文件.
执行shell程序文件有三种方法
(1)#chmod +x file
(2)#sh file
(3)# . file
在编写shell时,第一行一定要指明系统需要那种shell解释你的shell程序,如:#! /bin/bash,
#! /bin/csh,/bin/tcsh,还是#! /bin/pdksh .
2.shell中的变量
(1)常用系统变量
$ # :保存程序命令行参数的数目
$ ? :保存前一个命令的返回码
$ 0 :保存程序名
$ * :以("$1 $2...")的形式保存所有输入的命令行参数
$ @ :以("$1""$2"...)的形式保存所有输入的命令行参数
(2)定义变量
shell语言是非类型的解释型语言,不象用C++/JAVA语言编程时需要事先声明变量.给一
个变量赋值,实际上就是定义了变量.
在linux支持的所有shell中,都可以用赋值符号(=)为变量赋值.
如:
abc=9 (bash/pdksh不能在等号两侧留下空格 )
set abc = 9 (tcsh/csh)
由于shell程序的变量是无类型的,所以用户可以使用同一个变量时而存放字符时而存放
整数.
如:
name=abc (bash/pdksh)
set name = abc (tcsh)
在变量赋值之后,只需在变量前面加一个$去引用.
如:
echo $abc
(3)位置变量
当运行一个支持多个命令行参数的shell程序时,这些变量的值将分别存放在位置变量里.
其中第一个参数存放在位置变量1,第二个参数存放在位置变量2,依次类推...,shell保留
这些变量,不允许用户以令外的方式定义他们.同别的变量,用$符号引用他们.

3.shell中引号的使用方法
shell使用引号(单引号/双引号)和反斜线("")用于向shell解释器屏蔽一些特殊字符.
反引号(")对shell则有特殊意义.
如:
abc="how are you" (bash/pdksh)
set abc = "how are you" (tcsh)
这个命令行把三个单词组成的字符串how are you作为一个整体赋值给变量abc.
abc1='@LOGNAME,how are you!' (bash/pdksh)
set abc1='$LOGNAME,how are you!' (tcsh)
abc2="$LOGNAME,how are you!" (bash/pdksh)
set abc2="$LOGNAME,how are you!" (tcsh)
LOGNAME变量是保存当前用户名的shell变量,假设他的当前值是:wang.执行完两条命令后,
abc1的内容是:$LOGNAME, how are you!.而abc2的内容是;wang, how are you!.
象单引号一样,反斜线也能屏蔽所有特殊字符.但是他一次只能屏蔽一个字符.而不能屏蔽
一组字符.
反引号的功能不同于以上的三种符号.他不具有屏蔽特殊字符的功能.但是可以通过他将
一个命令的运行结果传递给另外一个命令.
如:
contents=`ls` (bash/pdksh)
set contents = `ls` (tcsh)
4.shell程序中的test命令
在bash/pdksh中,命令test用于计算一个条件表达式的值.他们经常在条件语句和循环
语句中被用来判断某些条件是否满足.
test命令的语法格式:
test expression
或者
[expression]

在test命令中,可以使用很多shell的内部操作符.这些操作符介绍如下:
(1)字符串操作符 用于计算字符串表达式
test命令 | 含义
-----------------------------------------
Str1 = str2 | 当str1与str2相同时,返回True
Str1! = str2| 当str1与str2不同时,返回True
Str | 当str不是空字符时,返回True
-n str | 当str的长度大于0时,返回True
-z str | 当str的长度是0时,返回True
-----------------------------------------
(2)整数操作符具有和字符操作符类似的功能.只是他们的操作是针对整数
test表达式 | 含义
---------------------------------------------
Int1 -eq int2|当int1等于int2时,返回True
Int1 -ge int2|当int1大于/等于int2时,返回True
Int1 -le int2|当int1小于/等于int2时,返回True
Int1 -gt int2|当int1大于int2时,返回True
Int1 -ne int2|当int1不等于int2时,返回True
-----------------------------------------
(3)用于文件操作的操作符,他们能检查:文件是否存在,文件类型等
test表达式 | 含义
------------------------------------------------
-d file |当file是一个目录时,返回 True
-f file |当file是一个普通文件时,返回 True
-r file |当file是一个刻读文件时,返回 True
-s file |当file文件长度大于0时,返回 True
-w file |当file是一个可写文件时,返回 True
-x file |当file是一个可执行文件时,返回 True
------------------------------------------------
(4)shell的逻辑操作符用于修饰/连接包含整数,字符串,文件操作符的表达式
test表达式 | 含义
----------------------------------------------------------
! expr |当expr的值是False时,返回True
Expr1 -a expr2|当expr1,expr2值同为True时,返回True
Expr1 -o expr2|当expr1,expr2的值至少有一个为True时,返回True
-----------------------------------------------------------
注意:
tcsh shell 不使用test命令,但是tcsh中的表达式同样能承担相同的功能.tcsh
支持的表达式于C中的表达式相同.通常使用在if和while命令中.
tcsh表达式 | 含义
-------------------------------------------------------
Int1 <= int2 |当int1小于/等于int2时,返回True
Int1 >= int2 |当int1大于/等于int2时,返回True
Int1 < int2 |当int1小于int2时,返回True
Int1 > int2 |当int1大于int2时,返回True
Str1 == str2 |当str1与str2相同时,返回True
Str1 != str2 |当str1与str2不同时,返回True
-r file |当file是一个可读文件时,返回True
-w file |当file是一个可写文件时,返回True
-x file |当file是一个可执行文件时,返回True
-e file |当file存在时,返回True
-o file |当file文件的所有者是当前用户时,返回True
-z file |当file长度为0时,返回True
-f file |当file是一个普通文件时,返回True
-d file |当file是一个目录时,返回True
Exp1 || exp2 |当exp1和exp2的值至少一个为True时,返回True
Exp1 && exp2 |当exp1和exp2的值同为True时,返回True
! exp |当exp的值为False时,返回True
5.条件语句
同其他高级语言程序一样,复杂的shell程序中经常使用到分支和循环控制结构,
bash,pdksh和tcsh分别都有两种不同形式的条件语句:if语句和case语句.
(1)if语句
语法格式:
bash/pdksh用法:
if [expression1]
then
commands1
elif [expression2]
commands2
else
commands3
if

tcsh用法:
if (expression1) then
commands1
else if (expression2) then
commands2
else
commands3
endif

含义:当expression1的条件为True时,shell执行then后面的commands1命令;当
expression1的条件为false并且expression2的条件满足为True时,shell执行
commands2命令;当expression1和expressin2的条件值同为false时,shell执行
commands3命令.if语句以他的反写fi结尾.

(2)case语句
case语句要求shell将一个字符串S与一组字符串模式P1,P2,...,Pn比较,当S与
某个模式Pi想匹配时,就执行相应的那一部分程序/命令.shell的case语句中字符
模式里可以包含象*这样的通配符.
语法格式:
bash/pdksh用法:
case string1 in
str1)
commands1;;
str2)
commands2;;
*)
commands3;;
esac

tcsh用法:
switch (string1)
case str1:
statements1
breaksw
case str2:
statements2
breaksw
default:
statements3
breaksw
endsw

含义:shell将字符串string1分别和字符串模式str1和str2比较.如果string1与str1匹配,则
shell执行commands1的命令/语句;如果string11和str2匹配,则shell执行commands2的命令/
语句.否则shell将执行commands3的那段程序/命令.其中,每个分支的程序/命令都要以两个
分号(;;)结束.

6.循环语句
当需要重复的某些操作时,就要用到循环语句.

(1)for语句
大家知道在很多编程语言中for语句是最常见.在shell中也不例外.for语句要求shell将包含
在这个语句中的一组命令连续执行一定的次数.
语法格式:
bash/pdksh
用法1:
for var1 in list
do
commands
done
含义:在这个for语句中,对应于list中的每个值,shell将执行一次commands代表的一组命令.
在整个循环的每一次执行中,变量var1将依此取list中的不同的值.
用法2:
for var1
do
setatements
done
含义:在这个for语句中,shell针对变量var1中的每一项分别执行一次statements代表的一组
命令.当使用这种形式的语句时,shell认为var1变量中包含了所有的位置变量,而位置变量中
存放着程序的命令行参数值.也就是说,他等价于下列形式:
for var1 in " $@"
do
statements
done

tcsh用法:
在tcsh中没有for这个单词,与for语句起同样功能的是foreach语句
foreach name (list)
commands
end

举例:
for file ;bash/pdksh
do
tr a-z A-Z<$file>file.caps
done

# ;tcsh
foreach file ( $ * )
tr a-z A-Z<$file>$file.caps
end


(2)while语句
while语句是shell提供的另一种循环语句. while语句指定一个表达式和一组命令.这个
语句使得shell重复执行一组命令,直到表达式的值为False为止.
语法格式:
while expression ;bash
do
statements
done

while (expression) ;tcsh
statements
end
举例:
count=1 ;bash
while [ -n "$ *"] ***
do
echo "this is a parameter number $count $1"
shift
count='expr $count + 1'
done

set count = 1 ;tcsh
while ( " $ * " ! = "")
echo "this is a parameter number $count $1"
shift
set count = 'expr $count + 1'
end

语句中shift命令的功能是将所有的命令行参数依次相左传递.

(3)until语句
until与while语句具有类似的语法格式和功能,不同的是while中expression的值为True时,
shell执行命令组;而until中当expression的值为False时,shell才执行那组命令.
语法格式:
until expression
do
commands
done
举例:
count=1
until [ -z " $ * "] ***
echo "this is a parameter number $count $1"
shift
count='expr $count + 1'
done
情注意上述例子中带***号.在while中的表达式: -n string,他的含义是当string不是空
字符串时,表达式的值为True;在until中的表达式: -z string,他的 含义是当string是空
字符串时,表达式的值为True.由此可见,两个程序对条件表达式的设置恰好是相反的.

(4)shift语句
bash和tcsh都支持shift命令.shift将存放在位置变量中的命令行参数,依次向左传递.例如
位置变量当前值为:
$1=file1 $2=file2 $3=file3
执行一次shift命令后,位置变量的值为:
$1=file2 $2=file3
还可以在shift命令中指定位置变量转移的次数, 如:
shift n
例子:
while [ "$1"]
do
if [ "$1"="-i"] then
infile=" $2"
shift 2
else if [ "$1"="-o"] then
outfile="$2"
shift 2
else
echo "Program $0 does not recognize option $1"
fi
done
tr a-z A-Z<$infile>$outfile

(5)select语句
select语句是pdksh提供的一个独特的循环语句.他不同于前面介绍的循环语句.他不是
反复计算一个条件表达式,并依据表达式的值决定是否执行一组命令.select的功能是自动的
生成一个简单的文本菜单.
语法格式:
select menu [in list_of_items]
do
commands
done
含义:当执行一个select语句时,pdksh分别为每个列在list_of_items中的成员建立一个菜单
选项.list_of_items既可以是一个包含多个选项的变量,也可以是直接列在程序中的一组选项
.如果语句中没有提供list_of_items,select语句将使用位置变量作为list_of_items.
举例:
select menuitem in pick1 pick2 pick3
do
echo "are you sure you want to pick $menuitem"
read res ;接收用户的输入,并且将输入的值存放在特定变量里.
if [ $res=" y" -o $res=" Y"]
then
break ;用于退出while,for,select等循环语句
fi
done
(6)repeat语句
repeat语句是tcsh提供的独有的循环语句.使用repeat命令要求shell对一个命令执行一定
的次数.
语法格式:
repeat count command
如;
foreach num ( $ *)
repeat $num echo -n " *"
echo " "
end

7.shell中的函数
shell允许用户定义自己的函数.函数是高级语言中的重要结构.shell中的函数于C或者其他
语言中定义的函数一样.与从头开始,一行一行地写程序相比,使用函数主要好处是有利于组织
整个程序.在bash中,一个函数的语法格式如下:
fname (){
shell comands
}
定义好函数后,需要在程序中调用他们.bash中调用函数的格式:
fname [parm1 parm2 parm3...]
调用函数时,可以向函数传递任意多个参数.函数将这些参数看做是存放他的命令行参数的
位置变量.
举例:
这个程序定义了4个函数:
upper ():将传递给他的文件中的字母转换成大写,并存放到同名的结尾为.out的文件中.
lower ():将传递给他的文件里的字母转换成小写,并存放到同名的结尾为.out的文件中.
print ():输出传递给他的文件的内容.
usage_error ():输出程序的帮助信息.
程序的主模块是个case条件语句,他根据命令行中第一个参数,决定程序要完成的功能,并调用相应
的函数完成这一功能.
upper (){
shift
for i
do
tr a-a A-Z<$!>$1.out
rm $1
mv $1.out $1
shift
done; }
lower () {
shift
for i
do
tr A-Z a-z<$1>$1.out
rm $1
mv $1.out $1
shift
done; }
print() {
shift
for i
do
lpr $1
shift
done; }
usage_error() {
echo " $1 syntax is $1 "
echo ""
echo " where option is one of the following"
echo " p--to print frame files"
echo " u--to save as uppercase"
echo " l--to save as lowercase";}
case $1 in
p | -p)print $@;;
u | -u)upper $@;;
l | -l)lower $@;;
*) usage_error $0;;
esac

------------------------------------------------------------------------------
总结
利用shell编程是提高系统管理工作效率的重要手段,学好shell跟了解系统基本命令和管理
工具的使用方法同样重要!

附:
A.bash中常用的命令
命令 | 含义
-------------------------------------------------------------------------------
Alias |设置命令别名
Bg |将一个被挂起的进程在后台执行
cd |改变用户的当前目录
exit |终止一个shell
export |使作为这个命令的参数的变量及其当前值,在当前运行的shell的子进程中可见
fc |编辑当前的命令行历史列表
fg |让一个被挂起的进程在前台执行
help |显示bash内部命令的帮助信息
history |显示最近输入的一定数量的命令行
kill |终止一个进程
pwd |显示用户当前工作目录
unalias |删除命令行别名
--------------------------------------------------------------------------------

B.bash中常用的系统变量
变量 | 含义
-------------------------------------------------------------------------------
EDITOR,FCEDIT |Bash的fc命令的默认文本编辑器
HISTFILE |规定存放最近输入命令行文件的名字
HISTSIZE |规定命令行历史文件的大小
HOME |当前用户的宿主目录
OLDPWD |用户使用的前一个目录
PATH |规定bash寻找可执行文件时搜索的路径
PS1 |命令行环境中显示第一级提示符号
PS2 |命令行环境中显示第二级提示符号
PWD |用户当前工作目录
SECONDS |当前运行的bash进程的运行时间(以秒为单位)


分享到:
评论

相关推荐

    Linux Shell 入门基础

    Linux Shell入门基础,Linux Shell入门基础

    Shell基础——Shell入门资料

    Linux 入门和Shell入门的好资料 完全免费 好好利用

    shell脚本基础入门

    正宗shell脚本基础入门 shell脚本基础入门 shell脚本基础入门 shell脚本基础入门 shell脚本基础入门 shell脚本基础入门 shell脚本基础入门 shell脚本基础入门

    shell设计入门.TXT shell设计入门

    shell设计入门 shell设计入门 shell设计入门 shell设计入门

    大数据shell入门到精通视频教程

    大数据shell入门到精通视频教程 ,教程很基础,很实用

    shell基础入门教程

    shell 编程 基础 中文教程 教你一步一步入门

    学习shell的入门资料(shell十三问+shell基础十二篇)doc版

    此资源包括两个word文档,《shell十三问》和《shell基础十二篇》,记录的是网络上的shell学习的帖子,浅显易懂,诙谐幽默,非常适合shell初学者,是shell入门学习最佳的材料。

    Shell编程入门基础必备视频教程.zip

    1Linux下Shell编程入门及变量讲解.mp4 2Linux下Shell编程入门及变量讲解.mp4 3Shell编程企业实战菜单系列.mp4 4Shell编程企业实战菜单系列.mp4 5Linux下LAMP实战及脚本编程思路讲解.mp4 6Linux下LAMP实战及脚本编程...

    Linux下Shell从入门到精通完整版视频.zip

    1.Linux下Shell编程基础入门.mp4 2.Shell编程之变量及LAMP导航菜单编写.mp4 3.Shell编程之IF条件语句各种案例演练.mp4 4.使用if条件语句编写MySQL备份脚本.mp4 5.Shell编程之LAMP一键安装脚本实战.mp4 6.For循环及...

    shell从入门到精通

    shell基础知识、shell字符串处理、shell表达式与运算符、shell流程控制、shell函数与数组、shell正则表达式、shell文本处理三剑客(grep、sed、awk)、shell标准输入、输出和错误、shell信号发送与捕捉、shell编程时...

    shell 编程基础

    shell 编程基础 shell 入门 shell 编程基础 shell 入门

    shell编程基础知识 基础入门 实操

    shell编程基础知识 基础入门 实操,均有实际例子 适合于初学者学习练手

    shell经典基础书籍(适合0基础)

    shell经典书籍,好好看肯定有收获,经典基础书籍(适合0基础)

    Shell编程基础教程

    shell编程基础教程是自己编写的内部培训课件,该教程将自己多年来使用shell的心得,归纳总结了一番。面向的对象为有一定Linux基础的shell初学者,从shell最简单的几个命令,到...该教程主要定义为shell的入门级学习。

    shell脚本基础入门 详细介绍完整版

    此文档是个人学习了《Linux命令行与shell脚本编程大全》后,整理的学习笔记以及学习心得,希望对大家有所帮助。

    Linux Shell编程从入门到精通

    本书由浅入深、循序渐进地详细讲解了LinuxShell编程的基本知识... 本书适合于Linux Shell编程的初学者,有一定LinuxShell编程基础,但还需要进一步提高的人阅读。本书对于有一定编程经验的程序员也有很好的参考价值。

    Shell基础入门

    Shell基础入门到精通,包括基本命令并有实例

    Linux快速入门以及shell编程基础知识

    本文将在30分钟内让你快速理解Linux系统的基础知识,并学会编写简单的shell脚本程序。 首先,Linux系统的目录结构与Windows系统不同,它采用“根目录”“home目录”“等级目录”等组织方式。学习cd,ls,mkdir等命令可以...

    Linux零基础学习笔记 Shell编程-菜鸟入门(超详细)

    作者从技术小白成长到玩转linux的手敲笔记,每一个字节都记录了作者对知识的热情,适合零基础入门的小白,共同进步!(笔记需要使用typora打开)

    shell编程入门.doc

    简单的shell入门,增强shell基础,大牛飘过,菜鸟可以看看

Global site tag (gtag.js) - Google Analytics