shell脚本学习整理(一)

什么是shell脚本?

Shell脚本与Windows/Dos下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的。但是它比Windows下的批处理更强大,比用其他编程程序编辑的程序效率更高,它使用了Linux/Unix下的命令。

初识shell脚本

写进去一串命令之后,可以按chmod +x test_8_8.sh或bash test_8_8.sh进行运行。(chmod后有空格)

note:shell脚本一行即是一个命令无需加分号。

运行后可以看到执行结果如下:

shell脚本执行过程

(一)使用chmod +x 脚本文件名

shell会fork一个子进程并调用exec系统调用执行脚本文件这个程序。由于脚本文件是个文本文件没有_start和代码段,因此使用exec的另一种机制。文本文件的第一行指定了解释器,则用解释器程序的代码段替换当前进程,并从解释器代码段的_start开始执行而这个文本文件被当做命令行参数传给解释器。这个过程实际上相当于执行程序。

(二)使用bin/bash 脚本文件名

bash先fork一个子进程shell用于执行脚本,shell一行一行读取脚本中的命令,再fork一个一个子进程,shell等待每句执行完成后执行下一句,直到文件末尾shell终止,bash等待用户输入。

shell变量与变量引用

按照惯例 ,Shell变量由全大写字母加下划线组成,有两种类型的Shell变量:

环境变量——环境变量可以从父进程传给子进程,因此Shell进程的环境变量可以从当前Shell进程传给fork 出来的子进程。用printenv命令可以显示当前Shell进程的环境变量。

本地变量——只存在于当前Shell进程,用set命令可以显示当前Shell进程中定义的所有变量(包括本地变量 和环境变量)和函数。

环境变量是任何进程都有的概念,而本地变量是Shell特有的概念。在Shell中,环境变量和本地变量的定义和用法相似。

在Shell中定义或赋值一个变量:

VALUE=100

note:注意等号两边都不能有空格,否则会被Shell解释成命令和命令行参数。

一个变量定义后仅存在于当前Shell进程,它是本地变量,用export命令可以把本地变量导出为环境变量,定义和导出环境变量通常可以一步完成:

如果一个变量叫做VARNAME,用${VARNAME}可以表示它的值,在不引起歧义的情况下也可以 用$VARNAME表示它的值。

note: 在定义变量时不用$,取变量值时要用$。和C语言不同的是,Shell变量不需要明确定义类型,事实上Shell变量的值都是字符串。Shell变量不需要先定义后使用,如果对一个没有定义的变量取值,则值为空字符串。

命令代换与转移字符

由反引号括起来的也是一条命令 ,Shell先执行该命令,然后将输出结果立刻代换到当前命令行中。

算数代换$(())

和C语言类似,\在Shell中被用作转义字符,用于去除紧跟其后的单个字符的特殊意义(回车除 外),换句话说,紧跟其后的字符取字面值。

创建一个文件夹名为$ $

有一个字符虽然不具有特殊含义,但是要用它做文件名也很麻烦,就是-号。如果要创建一个文件名以-号开头的文件,这样是不行的: 即使加上\转义也还是报错: 因为各种UNIX命令都把 -号开头的命令行参数当作命令的选项,而不会当作文件名。如果非要处理 以-号开头的文件 名,可以有两种办法:

单引号与双引号

Shell脚本中的单引号和双引号一样都是字符串的界定符而不是字符的界定符。单引号用于保持引号内所有字符的字面值,即使引号内的\和回车也不例外, 但是字符串中不能出现单引号。如果引号没有配对就输入回车,Shell会给出续行提示符, 要求用户把引号配上对。双引号用于保持引号内所有字符的字面值 (回车也不例外),有例外。

时间: 2024-11-10 15:29:09

shell脚本学习整理(一)的相关文章

shell脚本学习整理(二)

条件测试--test 或[ 命令"test"或"["可以测试一个条件是否成立,如果测试结果为真,则该命令的退出码为0,如果测试结果为假,则命令的退出码为1. 常见测试命令举例: note:左方括号[是一个命令的名字,传给命令的各参数之间应该用空格隔开,比如,$VAR.-gt.3.]是[命令的四个参数,它们之间必须用空格隔开.命令test或[的参数 形式是相同的,只不过test命令不需要]参数. 与.或.非的测试命令  [ ! EXPR ]  : EXPR可以是上述中

笔记——shell脚本学习指南

<shell脚本学习指南>机械工业出版 ISBN 987-7-111-25504-8 第2章 2.4 初级陷阱 1.当今的系统,对#!这一行的长度限制从63到1024个字符都有,尽量不要超过64个字符. 2.在某些系统上,命令行部分包含了命令的完整路径名称.不过有些系统却不是这样:命令行的部分会原封不动地传递给被引用的程序. 3.别在选项之后放置任何空白,因为空白也会跟着选项一起传递给被引用的程序. 4.你需要知道解释其的完整路径名称.这可以用来规避可移植问题,因为不同的厂商可能将同样的东西放

shell脚本学习指南

以下八点不敢说就能成为你shell脚本学习指南de全部,至少可以让你编写出可靠的shell脚本. 1. 指定bash shell 脚本的第一行,#!之后应该是什么? 如果拿这个问题去问别人,不同的人的回答可能各不相同.我见过/usr/bin/env bash,也见过/bin/bash,还有/usr/bin/bash,还有/bin/sh,还有/usr/bin/env sh.这算是编程界的“’茴’字四种写法”了. 在多数情况下,以上五种写法都是等价的.但是,写过程序的人都知道:“少数情况”里往往隐藏

shell脚本学习与总结

shell脚本学习总结,东西很多,供初学者参考. shell脚本是区分大小写的. 2.Unix特殊字符有: ( ; $ ? & * () [] ` ' " + 使用其时要进行转义() 3.Shell的注释以#开头 4.函数的定义Function fuction_name(){ Command to execute} 调用时直接用function_name. 5.控制结构 1)If...then语句 If [ test_command ]    Then    Commandsfi2)If

shell脚本学习笔记系列--1

一.学好shell编程的知识储备 1.相关Linux系统命令应用: 2.Vi/vim 编辑器的熟练使用,相关客户端软件的设置: 3.基础的服务,系统服务ntp,crond,网络服务:nfs,rsync,inotify,sersync,ssh,lanmp等. 补充:清空日志的三种方法: 1)echo  " " > filename.log 2)>filename.log 3)cat  /dev/null > filename.log 注:工作中有的时候不能删除(日志)文

shell脚本学习笔记:通过shell实现linux用户管理和监控

学习shell做的第一个脚本,感谢云知梦李强强老师的shell编程教程 创建shell脚本文件: touch menu.sh touch index.sh touch welcome.sh 赋予脚本文件可执行权限: chmod a+x menu.sh index.sh welcome.sh menu.sh #!/bin/bash #menu.sh function menu(){ title="My Home" name="Randy" time=`date +%Y

shell脚本学习笔记 (sed的高级用法----模式空间和保持空间)

前段时间在学习shell脚本,上次有提到sed的模式空间和保持空间概念,但是一直没有研究好,这两天研究了一下,所以将它发出来,不是很全面,仅仅供大家参考一下. 保持空间sed在正常情况下,将处理的行读入模式空间,脚本中的"sed command(sed命令)"就一条接着一条进行处理,直到脚本执行完毕.然后该行被输出,模式被清空:接着,在重复执行刚才的动作,文件中的新的一行被读入,直到文件处理完毕. 模式空间可以比喻为一个生产线,而保持空间则可以被比喻为仓库,这个比喻希望可以帮助大家理解

shell 脚本学习

距离上一次写东西又隔了一段时间了,期间一直跟着私房菜学习,还是没养成定期做记录的习惯,今天就来写第一个脚本的编写吧. 经过几天的积累,学习了下shell脚本的编写,目前掌握的还不太成熟,凡事从小入手肯定是没错的,先写个简单的吧(难的也不会写o(╯□╰)o). 这个脚本的执行方法,就是输入生日来计算当前日期距离生日还有多少天,如果已经过完生日则计算来年生日的时间. #!/bin/bash #Program: #    Calculate how long it takes to have a bi

Shell脚本学习一:shell三种引号学习

一.Shell中变量的声明和引用 [[email protected] ~]# var1=Hello [[email protected] ~]# echo $var1 Hello [[email protected] ~]# echo ${var1}World HelloWorld 在Shell中,变量的引用使用$. 上面的代码中,$var1就是对变量var1的引用,输出的结果是Hello. 如果想链接其他字符,将变量放到大括号{}里面,然后在后面跟上其他内容. 例如上面的代码中:${var1