Linux之19——Shell编程基础详解
第⼀部分:Linux Shell 简介
Shell 是⼀个⽤ C 语⾔编写的程序,它是⽤户使⽤ Linux 的桥梁。Shell 既是⼀种命令语⾔,⼜是⼀种程序设计语⾔。
Shell 是指⼀种应⽤程序,这个应⽤程序提供了⼀个界⾯,⽤户通过这个界⾯访问操作系统内核的服务。
Ken Thompson 的 sh 是第⼀种 Unix Shell,Windows Explorer 是⼀个典型的图形界⾯ Shell。
当⼀个⽤户登陆linux 系统后,系统就会为该⽤户创建⼀个shell程序。
Shell的版本:
Bourne Shell:是贝尔实验室开发的,unix普遍使⽤的shell,在编程⽅⾯⽐较优秀,但在⽤户交互⽅⾯没有其他shell优秀。
BASH:是GNU的Bourne Again Shell,是GNU操作系统上默认的shell,在bourne shell基础上增强了很多特性,如命令补全,命令历史表等等
Korn Shell:是对Bourne Shell 的发展,在⼤部分内容上与Bourne Shell兼容,集成了C Shell和Bourne shell优点。
C Shell:是SUN公司Shell的BSD版本,语法与c语⾔相似,⽐bourne shell 更适合编程
第⼆部分 shell 程序设计基础
2.1 shell输⼊输出
2.1.1 echo
echo命令可以显⽰⽂本⾏或变量取值,或者把字符串输⼊到⽂件中
格式: echo string
echo的常⽤功能:\c 不换⾏ \f 不进纸 \t 跳格 \n 换⾏
note:
对于linux系统,必须使⽤-e选项来使以上转义符⽣效
例:
$ echo  -e  "hello\tboy"
hello boy
echo命令对特殊字符敏感,如果要输出特殊字符,需要⽤\屏蔽其特殊含义。
常⽤的特殊字符:双引号"" 反引号`` 反斜线\
例:
$ echo "\"\""      //想输出""
""
2.1.2 read
read命令从键盘或者⽂件的某⼀⾏⽂本中读⼊信息,并将其赋给⼀个变量。
如果只指定了⼀个变量,read会把所有的输⼊赋给该变量,直⾄遇到第⼀个⽂件结束符或回车
格式:read var1 var2 …
例1:
chenshifengdeMacBook-Pro:~ chenshifeng$ read name
Hello I am superman
chenshifengdeMacBook-Pro:~ chenshifeng$ echo $name
Hello I am superman
如果输⼊的值个数多于变量个数,多余的值会赋给最后⼀个变量:
例2:
chenshifengdeMacBook-Pro:~ chenshifeng$ read name surname
John Mike Kate
chenshifengdeMacBook-Pro:~ chenshifeng$ echo $surname
Mike Kate
chenshifengdeMacBook-Pro:~ chenshifeng$
2.1.3 cat
cat可以⽤来显⽰⽂件,并且⽀持将多个⽂件串连接后输出
note:该命令⼀次显⽰完整个⽂件,若想分页查看,需使⽤more
格式:cat [ options ] filename1 … filename2 …
常⽤options:
-v 显⽰控制字符
-n 对所有输出⾏进⾏编号
-b 与-n相似,但空⽩⾏不编号
例:
$ cat  file1 file2 file3      // 同时显⽰三个⽂件
$ cat –b file1 file2 file3
2.1.4 管道 |
可以通过管道把⼀个命令的输出传递给另外⼀个命令做为输⼊
格式:命令1 | 命令2
例:
$ | grep 'hello'
2.1.5 tee
把输出的⼀个副本输送到标准输出,另⼀个副本拷贝到相应的⽂件中
如果想看到输出的同时,把输出也同时拷⼊⼀个⽂件,这个命令很合适
格式: tee -a file
-a 表⽰⽂件追加到末尾
file 表⽰保存输出信息的⽂件
tee命令⼀般和管道符|结合起来使⽤
例:
$ who | tee who.info      // 该命令的信息返回在屏幕上,同时保存在⽂件who.info中
$ who | tee who.info
chenshifeng console  Jan  9 12:56
chenshifeng ttys000  Jan  9 13:27
chenshifeng ttys004  Jan  9 19:11
chenshifeng ttys005  Jan 10 00:12
$ cat who.info
chenshifeng console  Jan  9 12:56
chenshifeng ttys000  Jan  9 13:27
chenshifeng ttys004  Jan  9 19:11
chenshifeng ttys005  Jan 10 00:12
2.1.6 标准输⼊,输出和错误
当我们在shell中执⾏命令的时候,每个进程都和三个打开的⽂件相联系,并使⽤⽂件描述符来引⽤这些⽂件,见下表
⽂件⽂件描述符
输⼊⽂件-标准输⼊0
输出⽂件-标准输出1
错误输出⽂件-标准错误2
系统中实际上有12个描述符,可以任意使⽤⽂件描述符3-9
标准输⼊对应⽂件描述符0,是命令的输⼊,缺省键盘
标准输出对应⽂件描述符1,是命令的输出,缺省屏幕或⽂件
标准错误对应⽂件描述符2,是命令错误的输出,缺省屏幕或⽂件
利⽤⽂件重定向功能对命令的标准输⼊,输出和错误进⾏修改。
常⽤⽂件重定向命令:
command > file:标准输出重定向到⼀个⽂件,错误仍然输出屏幕
command >> file:标准输出重定向到⼀个⽂件(追加)
command 1> file:标准输出重定向到⼀个⽂件
command 2>> file:标准错误重定向到⼀个⽂件(追加)
command >file 2>&1:标准输出和标准错误⼀起重定向到⼀个⽂件
command >>file 2>&1:标准输出和标准错误⼀起重定向到⼀个⽂件(追加)
command < file1 >file2:以file1做为标准输⼊,file2做为标准输出
command <file:以file做为⽂件标准输⼊
结合使⽤标准输出和标准错误
$ cat hello 1>myfile.out  2>myerror.out
合并标准输出和标准错误
$ cat >>mylog.out  2>&1  <hello
2.2 shell后台执⾏命令
2.21 cron
cron是系统的调度进程,可在⽆⼈⼲预的情况下运⾏作业,通过crontab的命令允许⽤户提交,编辑或者删除相应的作业。
每个⽤户都可以有⼀个crontab⽂件来保存调度信息,通过该命令运⾏任意⼀个shell脚本或者命令
在⼤的系统中,系统管理员可以通过/etc/cron.allow和/etc/cron.deny这两个⽂件来禁⽌或允许⽤户拥有⾃⼰的crontab⽂件crontab的域
第1列分钟0~59
第2列⼩时0~23(0表⽰⼦夜)
第3列⽇1~31
第4列⽉1~12
第5列星期0~6(0表⽰星期天)
第6列要运⾏的命令
crontab格式:分<>时<>⽇<>⽉<>星期<>要运⾏的命令
<>表⽰空格
note:如果要表⽰范围的话,如周⼀到周五,可以⽤1-5表⽰
如果要列举某些值,如周⼀、周五,可以⽤1,5表⽰
例1:
30  21  *  *  *  /apps/bin/cleanup.sh
例2:
0,30  18-23  *  *  *  /apps/bin/dbcheck.sh
crontab的命令选项
格式:crontab [ -u user ] -e -l -r
其中
-u ⽤户名,如果使⽤⾃⼰的名字登陆,就不⽤使⽤-u选项
-e 编辑crontab⽂件
-l 列出crontab⽂件中的内容
-r 删除crontab⽂件
创建⼀个新的crontab⽂件
1 创建⼀个⽂件,建议名为cron,例shifengcron,在⽂件中假如如下内容:
0,10,20,30,40,50  *  *  *  *  /bin/echo "hello boy"
保存退出
2 提交刚刚创建的cron⽂件shifengcron
$ crontab shifengcron
$ ls /var/spool/cron/ 是否⽣成⽂件shifengcron
列出crontab⽂件
$ crontab –l
$ crontab –l  >  $HOME/mycron  可以通过这种⽅法对crontab进⾏备份
编辑crontab⽂件
$ crontab  -e
修改后保存退出,cron会对其进⾏必要的完整性检查
删除crontab⽂件
$ crontab –r
crontab⽂件的恢复
如果误删了crontab⽂件,假设在$HOME⽬录下还有备份,可以将这个备份⽂件拷贝到/var/spool/cron/ username是⽤户名,如果由于权限问题⽆法拷贝,可以使⽤
$ crontab <filename>
note:filename是备份的crontab⽂件的名字
2.22 at
at命令允许⽤户向cron守护进程提交作业,使其在稍后的时间运⾏,这个时间可以是10min以后,也可能是⼏天以后,但如果时间⽐较长,建议还是使⽤crontab
格式:at [ -f script ] [ -m -l -r ] [ time ] [ date ]
-f script 是要提交的脚本或命令
-m 作业完成后给⽤户发邮件
-r 清除某个作业,需要提供作业标识id
time 作业执⾏的时间格式可以为:HH. MM ,HH:MM
H代表⼩时,M代表分钟
date ⽇期格式可以是⽉份数或⽇期数,⽽且at命令可以识别诸如today,tomorrow这样的词
可以通过命令⾏⽅式或者at命令提⽰符⽅式来提交作业,⼀般来讲,如果提交多个命令,可以使⽤at命令提⽰符;如果提交的是shell脚本,可以使⽤命令⾏⽅式
例:提⽰符⽅式:
$ at 01:15
at > echo “hello”
at > echo “boy”  >/home/wuxh/at.log
at > <EOT>
note:EOT是Ctrl+D,任务执⾏后,会给当前⽤户发送邮件,通过mail命令可以查看相关信息,也可以将信息重定向到⽂件
例:提交shell脚本⽅式
$ at  3:00pm  tomorrow –f  /home/wuxh/hello.sh
note:该脚本将在明天下午3点运⾏,使⽤脚本⽅式,要加参数-f
列出at任务,格式:at -l
例:
$ at  -l
5 2021-01-17 11:20 a root
note: 第⼀个是作业标识id;第⼆个是⽇期;第三个是时间;a代表at;第四个代表创建任务的⽤户
清除at任务
格式:at -r
$ at  –r  [ job no]
例:$ at -r 5
note:不接job no将清除所有未执⾏的任务,接具体job id将清楚对应的任务
2.23 &
当在前台运⾏某个作业时,终端被该作业占据;⽽当它在后台运⾏时,它不会占据终端
可以借助&命令把作业放到后台执⾏
格式:命令 &
注:
1 .需要⽤户交互的命令不要放在后台执⾏,否则机器⼀直等待
2 .后台程序在执⾏时,执⾏结果仍然会输出到屏幕,⼲扰我们的⼯作,建议将这样的信息重定向到某个⽂件
即:command > out.file 2>&1 &
将标准输⼊错误输出都定向到⼀个out.file的⽂件中
例:$ find /etc/ -name "hello" -print >find.dt 2>&1 &
2.3 引号
""双引号
`反引号
''单引号
\反斜线
linux命令及shell编写2.31 双引号
可引⽤除字符$,`,\外的任意字符或者字符串,对$,`,\敏感
例1:
$ echo "hello"
hello
例2:
$ echo "$$"
8311            ///想输出字符$$  结果看到的是数值8311
$ echo "\$$"      //对特殊字符需要反斜线屏蔽其特殊含义
$$              //得到想要的结果
例3:
$ echo "`V_V`"  //想输出`V_V`字样结果得到错误信息
$ echo "\`V_V\`"    //得到`V_V`输出
2.32 单引号
单引号和双引号的⽤法基本类似,不同的是单引号对特殊字符不敏感,可以将其做为普通字符输出出来
例:
$ echo '$$'              //结果 $$  不⽤借助\进⾏屏蔽
$ echo '`V_V`'          //结果`V_V`,和前⾯双引号⽐较
2.33 反引号
该命令⽤于设置系统命令的输出到变量,shell将反引号中的内容做为命令执⾏。
例1:
$ echo `hello`
-bash: hello: command not found
例2:
$ echo `date`
2021年 1⽉17⽇星期⽇ 23时40分18秒 CST
反引号可以和双引号结合起来使⽤:
例3:
$ echo "The date today is `date`"
The date today is 2021年 1⽉17⽇星期⽇ 23时41分15秒 CST
2.34 反斜线
如果⼀个字符有特殊含义,为防⽌shell误解其含义,可⽤\屏蔽该字符
具有特殊含义的字符
------------------------------------------------------------------------------------
& * ^ $ ` “ |
------------------------------------------------------------------------------------
例1 :
$ echo "$$"          //在屏幕上输出$$字符,结果显⽰3853
$ echo "\$$"          //⽤反斜线屏蔽,防⽌shell误解,结果显⽰$$
例2:
$ echo  *        //在屏幕上输出*字符,结果输出当前⽬录下内容
$ echo  \*            //⽤反斜线屏蔽,防⽌shell误解,输出*字符
2.4 shell变量,参数
2.4.1 系统变量
系统变量适⽤于所有⽤户进程,可以在命令⾏中设置,但⽤户注销时这些值将丢失,最好在.bash_profile中进⾏定义,或者/etc/profile 传统上,所有环境变量都⼤写,且必须⽤export命令导出
设置环境变量:
var_name=value; export var_name
或者:
var_name=value

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。