版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Shell脚本入门,什么是shell?,命令解释器俗称外壳程序 Linux下命令是可以运行的程序。 用户通过shell向kernel发送指令,kernel再向硬件发送指令 Shell的功能是提供用户操作计算机系统的一个接口,也是一个可执行程序 终端默认使用的是Bourne Shell(简称 bash),这个 Shell是Bourne Shell的增强版本,是基于GNU的架构下发展出来的。,通过xshell(软件)进行登录,通过图形界面的终端,父进程 子进程,标准输入 输出 及管道,0 标准输入 1 标准输出 2 标准错误输出,编译型语言和脚本编程语言,许多大中型程序是用编译型语言写的,例如:C
2、/C+/java。这类程序只要从源代码转换成目标代码,就能直接在计算机上执行。(java类似。它是转换成字节码,在java虚拟机上执行) 编译型语言的好处是效率高,它的二进制代码可直接被cpu执行。缺点是它们直接处理的是字节、整数、浮点数等机器层的对象。例如,C+很难进行“将一个目录内的所有文件复制到另一个目录”这样简单的操作。 脚本编程语言通常是解释型的语言,这类程序的执行是由解释器读入程序代码,并将其转换成内部的形式,再执行。这类语言有awk、perl、python、javascript、Ruby和shell。用脚本编程语言写的程序代码,称为脚本程序。 脚本编程语言的好处是,它多半运行在比
3、编译器还高的层级,能轻易处理文件和目录之类的对象。缺点是:它的效率通常不如编译型语言高。它们并不能直接被cpu执行,执行时还需要进行转换。,SHELL脚本的优点,shell脚本常用于系统管理工作,或是结合现有的程序以完成小型的、特定的工作。通过把工作用到的命令串起来,放进一个独立的脚本中,以后只要执行该程序就能完成工作了。 shell是各类unix版本的通用功能,且经过了POSIX的标准化。一个编写良好的shell脚本,可以应用到多个系统上。因此之所以使用shell脚本是基于: 简单性:shell是一个高级语言;通过它可以简洁地表达复杂的操作。 可移植性:使用POSIX所定义的功能,可以做到脚
4、本无需修改就可在不同的系统上运行。 开发容易:可以在较短时间内完成一个功能强大又好用的脚本。,SHELL脚本的格式,命令从上向下,从左向右 地分析和执行,如果读到一个 回车键,就尝试开始执行该行。 右图是一个shell脚本 第一行#!/bin/bash指明这个 脚本使用的解释器是bash,脚本 的语法是用bash的语法。例如perl脚本的第一行是#!/usr/bin/perl shell脚本用#号作为一行注释开始。#到行尾之间的内容被视为注释 接下来就是程序部分 告知执行的成功与否可以用命令exit 来结束脚本的执行,并且传回一个数值给系统。将来可以用$?来获取它传回的值。,rootlocal
5、host # vim helloworld.sh #!/bin/bash #my first shell script #history: 2012.01.01 echo “hello world” exit 0,Shell脚本执行方式,下面几种脚本执行的方法都属于是由父进程bash创建一个子进程,在子进程里运行命令解释器,由解释器读取并执行脚本。 假设写完一个脚本文件/home/jim/123.sh后,该如何执行呢? 有以下几种方式: 以bash进程来执行:通过“bash 123.sh” 来执行。 直接命令执行:123.sh文件必须要具备可读与可执行权限: 绝对路径:使用/home/jim/
6、123.sh来执行命令; 相对路径:假设工作目录在/home/jim/,这可以使用./123.sh来执行; 变量“PATH”功能:将123.sh放在PATH指定的目录下,例如:放在/bin/里,则可直接通过文件名123.sh来执行。,Bash shell特点,命令记忆能力 Linux可以记忆以前输入过的命令,只要使用上下键就可以找到以前执行的指令来执行。 这些命令按照先后顺序记录在用户Home目录下的隐藏文件.bash_history中 .bash_history里面记录了上一次登录以前执行过的命令,本次登录执行的命令都保存在内存中,只有成功注销之后,内存数据才会刷新到.bash_histor
7、y文件中 有时候.bash_history文件中记录了你包含在指令中的密码,可能引起安全问题,所以最好还是设置命令的记录数量不要太大。,Bash shell特点,命令补全补全功能 如果在执行命令的时候不想按下太多的按键(例如命令pcprofiledump),在输入了 pcprofile 之后,再按下 Tab 键的话,那么 bash 马上会自动的将后面的dump接上来。 如果有重复的命令,那么按下两次 Tab 将会把所有重复的命令列出来。 直接在提示字符后面连按两次 键,则系统会将所有可以使用的命令都列出来。 例如,如果想要知道目前系统里面,所有以b开头的命令呢?就是按下 b 之后,连按两次就o
8、k。,Bash shell特点,文件名称补全功能 如果用 vim 来读取某个文件,例如 /etc/man.config 这个文件,那么可以输入 vi /etc/man之后,直接按下 键,该文件名称就会被自动的补上。 同样,出现文件多个匹配项时,可以按下两个TAB键来显示所有匹配项。 这样大大增加了指令输入的正确率。,Bash shell特点,命令别名设置功能 alias unalias 假如我需要知道某个目录底下的所有文件信息(包含隐藏文件)及所有的文件属性,那么我就必须要输入ls -al 这样的指令。 每次都输入多麻烦! 可以通过为自己经常使用的命令(包括参数)定义别名来避免过多输入。 例如
9、:alias lm=ls -al (注意=两边不要有空格) 那么以后lm就等于执行ls -al 直接输入alias,可以显示目前以及定义好的所有别名,Shell环境变量,环境变量的形式通常如:name=value Linux内核并不查看这些字符串,他们的解释完全依赖于各个应用程序。例如,shell就使用了大量的环境变量,其中一些在登录时自动设置,如HOME和USER等,有些则由用户设置。 我们在shell中设置环境变量以控制shell的动作。例如设置了MAIL就告诉shell应该到哪里去取邮件。 显示变量值的命令:echo 用法:echo $variable 例如:在环境变量前加上$就代表使用
10、该变量的值 echo $PATH echo $HOME 查看当前所有Linux环境变量的命令:env,Shell配置文件,shell在启动时会读取一些配置文件。下面是bash的配置文件,实际上他们也是shell脚本。/etc目录下的是系统级的配置文件,另外两个是用户个性化的配置文件。 /etc/profile 设置系统级的环境变量 PATH、HOME、HISTSIZE等。第一次登录时运行该脚本。 /.bash_profile 用户可在这里设置环境变量或启动程序。当用户登录时,该文件仅仅执行一次 。 /.bashrc 用户可在这里设定别名和函数。启动shell时都会执行该配置文件。 /etc/b
11、ashrc 启动shell时运行该脚本。 /.bash_logout 退出shell时执行。,根据启动shell的方式不同,配置好脚本的执行也有不同: 对于login shell:即通过输入用户名和密码登陆或用su - 获得的shell。在shell启动时会按14的顺序依次执行这四个配置脚本。这时获得的是一个完全和用户名相符的shell环境。对于non-login shell:不需登录流程或以su的方式切换用户获得的shell。这种情况下,启动shell时只执行和两个配置脚本。例如,图形界面下启动一个终端,或者在原来的bash环境下再输入bash,都不需要用户名和密码;这两次获得的shell就
12、称为non-login shell。这时许多环境还未改变。比如PATH,因为它是在和中设置的。,根据启动shell的方式不同,配置好脚本的执行也有不同: 对于login shell:即通过输入用户名和密码登陆或用su - 获得的shell,在shell启动时会按14的顺序依次执行这四个配置脚本。这时获得的是一个完全和用户名相符的shell环境。 对于non-login shell:不需登录流程或以su的方式切换用户获得的shell。这种情况下,启动shell时只执行和两个配置脚本。例如,图形界面下启动一个终端,或者在原来的bash环境下再输入bash,都不需要用户名和密码;这两次获得的shel
13、l就称为non-login shell。这时许多环境还未改变。比如PATH,因为它是在和中设置的。 若修改了bash的配置文件,想让它的设置在当前环境下生效,可以使用命令source 或“.”后接配置文件。 例如在/.bashrc里设置了alias别名,想立即可用。 执行 source /.bashrc 或者. /.bashrc 接下来就可以使用这个别名了。,Type命令,Type可以查看命令的各种属性 Bash shell 有内置命令和外置命令 举例 ls cd Cd /bin Ll h,Shell 历史命令,命令名称: history 用法:history number 在退出 的时候才会
14、写入历史记录 History w 写入 显示最近 number个命令,不指定number则选择全部。 执行历史命令: 方法1:!number 执行历史命令中编号为number的那个命令 方法2:!command 执行历史命令中最近一次以command开头的命令,命令无须打全,只要匹配前面几个字符即可。 方法3:! 执行上一条命令 查看./.bash_history 修改历史记录的多少 Vim /etc/profile Histsize = 1000,变量类型,变量是用一固定的字符串或符号来表示一个可变的值。和C语言中相似。有以下几种变量: 用户自定义变量 预定义的特殊变量 环境变量(expor
15、t),用户自定义变量,变量无须事先声明 变量的可以用字符(a-z A-z)数字和下划线组成,但必须以字符开头。 变量与变量内容(值)用等号连接,等号左右不能有空格 变量的显示 echo,对变量赋值 #a=“hello shell” 打印变量 #echo $a,变量引用,$加变量名即可引用该变量的值。例如:$var 使用 可以使变量名和后续字母分开。例如: var=de $varabc的值为deabc $varabc是取变量varabc的值,若之前没有创建过varabc那么它的值为空 未定义的变量值为空,Shell变量赋值,双引号内的$ “ 字符以特殊字符解读。 单引号内的特殊字符全部当做普通字
16、符处理。,a=“aa” b=“$a”bb c=$acc echo $a echo $b echo $c,Shell变量赋值,把命令的执行结果赋值给变量(例如ls),用command,或$(command) 注意:是反引号(backquote), 不是单引号(quote),将ls的输出结果作为变量a的值 #a=ls 等价于 a=$(ls) 打印变量 #echo $a,预先定义的特殊变量,$#除脚本名外,命令行上参数的个数。 $?上一条前台命令执行后的返回值,也称退出码。每条命令执行后都有返回值,0代表成功,非零代表失败。 $当前进程的进程号。 $!上一个后台命令对应的进程号。 $*表示在命令行上
17、实际给出的所有实参。如输入下面的命令行: exam3 A B C D E F G H I J K 则$* 就是:A B C D E F G H I J K 而“$*”就等价于: $1 $2 $3,即: A B C D E F G H I J K。 $它与$*基本功能相同。但“$”与“$*”不同当用引号时”$”参数都是分离的。“$”就等价于: $1 $2 在上面情况下,就是“A” “B” “C”“K”。,例子:,-bash-3.2$ echo $ 10096 -bash-3.2$ pstree -p |grep sh | |-pdflush(163) | |-pdflush(164) |-set
18、roubleshootd(2365)-+-setroubleshootd(2570) | -setroubleshootd(2571) |-sshd(2593)-sshd(10091)-sshd(10095)-bash(10096)-+-grep(10374),环境变量,环境变量是指能被子进程所继承的变量。子进程只会继承父进程的环境变量 (1)HOME:用户主目录的全路径名。如/home/myname (2)LOGNAME:即用户注册名 (3)PWD:当前工作目录的路径。 (4)PATH:shell查找命令的路径(目录)列表,各个目录用冒号( : )隔开。 (5)PS1:shell的主提示符。
19、 (6)SHELL:当前使用的shell。通常,它的值是/bin/bash。 (7)TERM:终端类型。 可以用env命令列出当前环境下的所有环境变量及其值,也可用echo命令察看任何一个环境变量的值。 当更改了环境变量的值以后,往往利用export命令将这些变量输出,使它们成为公用量。例如: $ export HOME PATH PS1 用户自定义变量可以通过export命令,变成环境变量。例如: # asdf=1234 执行env,查看是否有变量asdf # export asdf 执行env ,查看是否有变量asdf,这一次asdf变成环境变量,预先定义的特殊变量,0代表正在执行的脚本名
20、称 199代表命令行传入的参数。 大于10时,必须用括起来,例如取第十个参数用$10 输入下面的命令行: # exam3 A B C D E F 那么 $0的值为exam3 $1到$6的值分别对应A到F 内置命令shift功能:造成参数变量号码偏移 用法:shift n 例如:上面的输入,执行命令 shift 3 之后,这些参数变量从第四个开始对应。 $1的值为D $2为E $3为F $4、$5、$6的值为空 直接shift等价于 shift 1,Shell算术运算,+ - * / % 分别对应加、减、乘、除、取余 只需将特定的算术表达式用 “$(” 和 “)” 括起来。a=$(4-2) a的
21、值为2,a=10 b=2 echo $($a+$b) echo $($a-$b) echo $($a*$b) echo $($a/$b) echo $($a%$b),Shell算术运算,shell的内置declare命令,可以声明变量的类型 declare i声明的变量,bash会认为它是整数。此时加减乘除不用放在$()中做运算,可以直接做运算。,a1=10 b1=20 c1=$a1*$b1 echo $c1 declare -i a2=10 declare -i b2=20 declare -i c2=$a2*$b2 echo $c2,跟用户交互,用bash内嵌的read命令 功能:读取来自
22、键盘的输入,并传给变量 用法:read 选项 变量名 选项: -p 字符串 后面接字符串给出提示 -t 时间 后接等待的秒数,即不会一直等待用户输入,#echo “input your name” #read name 上面两行可以用下面一行代替 #read -p “input your name” name #echo “my name is $name”,Shell逻辑判断: ,命令test 和判断符号 用于字符串,数字,文件目录的测试。 测试为真,则返回0,假返回1,可以通过$?得到返回值。常和后面的判断、循环语句结合在一起使用。 中括号 和里面的表达式之间必须有空格隔开 then ec
23、ho usage: command filename exit 1; fi if -f $1 ; then echo file $1 exists! fi,#!/bin/bash $# != 1 then action elif condition2 ; then action2 elif condition3 ; then else actionx fi,#!/bin/bash if $# != 1 ; then echo usage: command number exit 1; fi if $1 -lt 0 ; then echo $1 is less than 0 elif $1 -l
24、t 10 ;then echo $1 is betwen 0 and 9 elif $1 -lt 100 ; then echo $1 is between 10 and 99 else echo $1 is great equal than 100 fi,这个程序用来展示测试语句应用,$ cat exam10 echo -n key in a number (1-10 ) : #提示输入1-10之间的一个数字,光标不换行 read a #读取输入的数字 if $a -lt 1 -o $a -gt 10 #如果该数小于1或者大于10 then echo Error Number . #显示输入
25、数字有错 exit 2 #退出,返回码为2 elif ! $a -lt 5 #否则,若该数不小于5 then echo Its not less 5. #显示不小于5 的信息 else echo Its less 5. #否则,显示该数小于5 fi #结束if语句 echo accept key in value. #显示接受了键入的值,动手小练习,提示用户输入一个数,判断这个数是否是你想要的。想要的就打出 yes,否则就是no。 提示用户输入一个文件/目录,判断这个文件具有哪些属性? 写一个输入新的文件名,就自动创建C源文件的脚本程序,Shell分支判断:case,分支判断 case $变量
26、名称 in “第一个变量的内容”) 动作1 ; “第二个变量内容”) 动作2 ; *) #用*代表所有其他值 动作3 ; esac,#!/bin/bash if $# != 1 ; then echo usage: command number exit 1; fi case $1 in 2) echo you input number 2 ; 4) echo you input number 4 ; 6) echo you input number 6 ; *) echo invalid input esac,动手练习,提示用户输入一字符串,字符串必须为 “case”或者”esac” ,并打
27、印出来。如果输入的是其他字符串打印出错消息。,Shell循环:for,For循环三种方式: 1、像C语言一样使用,适合数值运算 for(语句;条件;语句) do action done 2、for i in 变量1 变量2 do action done 3、for i in $var do action done,#!/bin/bash if $# != 1 ;then echo usage: $0 loop_number exit 1 fi for(i=0;i$1;i+) do echo $i done,sum=0 for i in 2 4 6 8 do sum=$($sum+$i) don
28、e echo sum is $sum,For循环小练习,系统上面的各种账号都是写在/etc/passwd 内的第一个字段,你能不能通过命令cut找出每个账号的名称,用命令id、finger 输出他们的相关信息呢? 若想让用户输入一个目录名, 然后我找出该目录内的每个文件的读写执行权限,该如何做? 帮用户找到源目录下文件名包含指定字符串的文件,并将这些文件都拷贝到目标目录下。若找到的文件本身为目录,则不拷贝。 让用户输入一个大于0的数字,程序可以由 1+2+3. 一直累加到用户输入的数字为止,输出结果。,Shell循环:while,一、 while 条件 do action done 二、 un
29、til 条件 do action done,下面是计算1到loop的和 #!/bin/bash if $# != 1 ;then echo input number exit 1 fi sum=0; loop=$1 while $loop -gt 0 do sum=$($sum+$loop) loop=$($loop-1) done echo sum is $sum,until $a = 0 do echo $a; a=$($a-1); done,break/continue,Break n 跳出最近的n重循环,默认跳出最近的一重循环 continue 继续循环 练习: 写一个脚本打印出输入的命令行参数。 我们知道 /etc/passwd 里面以 : 来分割,第一栏为账号名称。请写一个程序,可以将/etc/passwd 的第一栏取出,而且每一栏都以一行字符串The 1 account is “root” 来显示,那个 1 表示行数,双引号里是账号名。,脚本
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026广东广州市招聘中山医学院医科公共平台技术员1人备考题库(完整版)附答案详解
- 2026广东广州市海珠区消防安全委员会办公室招聘街道微型消防站队员26人备考题库附完整答案详解【网校专用】
- 2026天津市安定医院招聘第三批派遣制人员3人备考题库附答案详解【考试直接用】
- 2026新疆图木舒克新纶化纤有限责任公司市场化选聘工作人员8人备考题库(名校卷)附答案详解
- 2026云南曲靖市罗平县妇幼保健院招聘编外人员18人备考题库附参考答案详解(轻巧夺冠)
- 2026广西上林国民村镇银行春季招聘备考题库完整版附答案详解
- 2026广西中烟工业有限责任公司博士后科研工作站博士后招聘6人备考题库含答案详解【黄金题型】
- 2026浙江丽水市松阳县国盛人力资源有限公司招聘专职消防员3人备考题库(满分必刷)附答案详解
- 2026湖南长沙市芙蓉区招聘中学骨干教师10人备考题库及完整答案详解(易错题)
- 2026西藏萨迦融媒体中心招聘农村电影放映员2人备考题库含答案详解(突破训练)
- 广东省广州市2026 届高三一模综合测试(一)政治试题(含答案)
- 2026年江西电力职业技术学院单独招生《职业适应性测试》模拟试题及参考答案
- 拆除扬尘治理责任制度
- Unit2Knowyourbody第12课时(课件)-外研版英语三年级下册
- 《中兽医》课件-3.脏腑学说
- 行政部门内部监督制度
- 1万吨年塑料和化纤专用钛白粉生产线申请建设环境影响评估报告
- (正式版)DB51∕T 2890-2022 《川西高原苹果生产技术规程》
- 广东省广州市广附大联盟校2025-2026学年九年级上学期期末语文试题(含答案)(含解析)
- DZ∕T 0211-2020 矿产地质勘查规范 重晶石、毒重石、萤石、硼(正式版)
- GB/T 17492-2019工业用金属丝编织网技术要求和检验
评论
0/150
提交评论