Shell脚本编程(一)
shell 脚本编程(一)
1 . shell 的作用
Shell的作用是解释执行用户的命令,用户输入一条命令,Shell就解释执行一条,这种方式称为交互式(Interactive),Shell还有一种执行命令的方式称为批处理(Batch),用户事先写一个Shell脚本(Script),其中有很多条命令,让Shell一次把这些命令执行完,而不必一条一条地敲命令。Shell脚本和编程语言很相似,也有变量和流程控制语句,但Shell脚本是解释执行的,不需要编译,Shell程序从脚本中一行一行读取并执行这些命令,相当于一个用户把脚本中的命令一行一行敲到Shell提示符下执行。
用户在命令行输入命令后, 一般情况下Shell 回fork一个子进程并exec该命令, 但是shell的内建命令例外, 执行内建命令相当与调用shell进程中的一个函数, 并不会创建新的进程, 例如:cd、alias、umask、exit 等命令都是内建命令, 凡是用which 命令查不到程序文件所在位置的命令都是内建命令, 内建命令没有单独的man手册, 要在man手册中查看内建命令, 应该用
# 查看内建的命令
$ man bash-builtins
写一个简单的shell脚本, t1.sh
#!/bin/sh
cd ..
ls说明:
shell 脚本中用# 表示注释, 相当于C语言的//注释, 但如果#位于第一行开头, 并且是 #!(称为Shenbang)则例外, 它表示该脚本使用后面指定的解释器/bin/sh解释执行。 如果把这个脚本文件加上课执行权限然后执行
chmod a+x t1.sh
# 通过 ./ 执行shell脚本
./t1.sh
说明:
Shell 会fork一个子进程并调用exec执行 ./t1.sh这个程序, exec系统调应该把子进程的代码段替换成 ./t1.sh 程序的代码段, 并从它的 _start 开始执行, 然而 t1.sh 是个文本文件, 根本没有代码段和 _start 函数, 那怎么办??
其实exec 还有另外以一种机制, 如果要执行的是一个文本文件, 并且第一行用Shebang指定的解释器, 则用解释器程序的代码段替换当前进程, 并且从解释器的 _start 开始执行, 而这个文本文件被当作命令参数传给解释器, 因此, 执行上述脚本相当于执行程序。
执行shell 脚本的方式:
# 通过source 命令执行.sh文件
$ source t1.sh
# 如果给文件添加了可执行权限, 可以通过一下方式执行shell 脚本
$ chmod a+x t1.sh # 给该文件添加可执行权限
# 通过./执行脚本
$ ./t1.sh
#直接用解释器去执行该文件
$ /bin/sh ./t1.sh
如果将命令行下输入的命令用()括起来, 这样也会fork 一个子Shell 执行 ()括号中的命令, 一行可以输入由分号 ;隔开多条命令。
[czk@localhost ~]$ (cd ..;ls -l)
total 0
drwx------. 2 czk czk 98 May 18 22:50 czk如果没有用括号将命令括起来, 则是在当前的shell进程进行执行, 并不会fork一个子进程进行去执行该命令。
2.基本变量
变量的类型
本地变量
只存在于当前Shell进程, 用set命令可以显示当前shell进程中定义的所有变量, 包括本地变量、环境变量和函数。
# 定义本地变量, 等号 = 两边不能由空格,变量名一般用大写+下划线组成
[czk@localhost ~]$ VARNAME=czk环境变量
环境变量可以从父进程传给子进程, 因此Shell进程的环境变量可以从当前shell进程传给fork出来的子进程。用printenv命令可以显示当前Shell进程的环境变量。
# 使用export 命令可以将本地变量导出为环境变量
[czk@localhost ~]$ export VARNAME=czk
# 使用 unset 命令可以删除本地或环境变量
[czk@localhost ~]$ unset VARNAME
[czk@localhost ~]$ echo ${VARNAME}
# 空。。。。变量可以通过 $ 或者 ${varname} 进行取值
注意,在定义变量时不用$,取变量值时要用$。和C语言不同的是,Shell变量不需要明确定义类型,事实上Shell变量的值都是字符串,比如我们定义VAR=45,其实VAR的值是字符串45而非整数。Shell变量不需要先定义后使用,如果对一个没有定义的变量取值,则值为空字符串。
3.命令代换
**` ** 或者 **$() **
由 反引号 括起来的也是一条命令, Shell 先执行该命令, 然后将输出结果立刻代换到当前命令行中。如下:
# date 日期函数
[czk@localhost ~]$ DATE=`date`
[czk@localhost ~]$ echo $DATE
Sat May 18 23:45:47 EDT 2019
# $() 方式
[czk@localhost ~]$ DATE=$(date)
[czk@localhost ~]$ echo $DATE
Sat May 18 23:47:20 EDT 2019
4.文件名代换
主要是用通配符就将文件匹配替换
* :匹配0个或者多个任意字符
?:匹配一个任意字符
[若干字符] : 匹配方括号中任意一个字符的一次出现
5.算术代换
$(())
这个是用来进行算术运算, $(()) 中的shell 变量取值将转换成整数, 如下:
# $(())中只能用+-*/和()运算符,并且只能做整数运算。
[czk@localhost ~]$ NUM=99
[czk@localhost ~]$ echo $(($NUM+1))
100
6.转义字符
\ 在shell中被用作转义字符用于去除紧跟其后的单个字符的特殊意义,
比如创建一个"$ $" 的文件
[czk@localhost ~]$ touch \$\ \$
[czk@localhost ~]$ ls
$ $ test.sh
还有一个字符也比较特殊, 它没有说明特殊含义, 但是用来做文件名也是比较麻烦的, 那就是 - 号。
它会把和它连在一起的字符, 当成了命令行参数的命令选项了,如果你硬要用 它来作文件名, 可以有如下两种方式:
[czk@localhost ~]$ touch ./-hi
[czk@localhost ~]$ ls
$ $ -hi test.sh
OR
[czk@localhost ~]$ touch -- -hello
[czk@localhost ~]$ ls
$ $ -hello -hi test.sh
7.单引号和双引号
Shell 脚本中的单引号和双引号一样都是字符串的界定符,而不是字符的界定符, 单引号用于保存引号内所有字符的字面值, 即使引号内的\和回车也不例外,但是字符串中不能出现单引号。如果引号没有配对就输入回车,Shell会给出续行提示符,要求用户把引号配上对。
[czk@localhost ~]$ echo '$SHELL'
$SHELL
被双引号用括住的内容,将被视为单一字串。它防止通配符扩展,但允许变量扩展。这点与单引号的处理方式不同。
[czk@localhost ~]$ DATE=$(date)
# 如果是双引号, 还会继续展开里面的内容
[czk@localhost ~]$ echo "$DATE"
Sun May 19 02:31:05 EDT 2019
[czk@localhost ~]$ echo '$DATE'
$DATE
Shell脚本编程(一)的更多相关文章
- Shell脚本编程30分钟入门
Shell脚本编程30分钟入门 转载地址: Shell脚本编程30分钟入门 什么是Shell脚本 示例 看个例子吧: #!/bin/sh cd ~ mkdir shell_tut cd shell_t ...
- Linux shell脚本编程(三)
Linux shell脚本编程 流程控制: 循环语句:for,while,until while循环: while CONDITION; do 循环体 done 进入条件:当CONDITION为“真” ...
- Linux shell脚本编程(二)
Linux shell脚本编程(二) 练习:求100以内所有偶数之和; 使用至少三种方法实现; 示例1: #!/bin/bash # declare -i sum=0 #声明一个变量求和,初始值为0 ...
- Linux shell脚本编程(一)
Linux shell脚本编程: 守护进程,服务进程:启动?开机时自动启动: 交互式进程:shell应用程序 广义:GUI,CLI GUI: CLI: 词法分析:命令,选项,参数 内建命令: 外部命令 ...
- Linux shell脚本编程基础之练习篇
shell脚本编程基础之练习篇. 1.编写一个脚本使我们在写一个脚本时自动生成”#!/bin/bash”这一行和注释信息. #!/bin/bash ] then echo "请输入一个参数& ...
- 【Linux】Shell脚本编程(一)
Linux shell脚本编程: 守护进程,服务进程:启动?开机时自动启动: 交互式进程:shell应用程序 广义:GUI,CLI GUI: CLI: 词法分析:命令,选项,参数 内建命令: 外部命令 ...
- 学习笔记之Linux Shell脚本教程:30分钟玩转Shell脚本编程
Linux Shell脚本教程:30分钟玩转Shell脚本编程 http://c.biancheng.net/cpp/shell/
- Shell脚本编程总结及速查手册
Shell是一种编程语言, 它像其它编程语言如: C, Java, Python等一样也有变量/函数/运算符/if语句/循环控制/… 但在开始之前, 我想先理清Shell语言与Shell之间的关系. ...
- 关于shell脚本编程的10个最佳实践
每一个在UNIX/Linux上工作的程序员可能都擅长shell脚本编程.但大家解决问题的方式却不尽相同,这要取决于对专业知识的掌握程度.使 用命令的种类.看待问题的方式等等.对于那些处在shell脚本 ...
- 《Linux命令行与shell脚本编程大全》 第二十七章 学习笔记
第二十七章:shell脚本编程进阶 监测系统统计数据 系统快照报告 1.运行时间 uptime命令会提供以下基本信息: 当前时间 系统运行的天数,小时数,分钟数 当前登录到系统的用户数 1分钟,5分钟 ...
随机推荐
- 交换机配置——STP实验(指定特定交换机为根桥)
一.实验目的:将三层交换机Switch3设置为根桥交换机 二.拓扑图如下: 三.具体步骤 先说明一下,四个交换机形成环路,为解决环路问题交换机会自动进行选举,选举出一个根源,根桥交换机会决定一个最佳路 ...
- hdu 5532 Almost Sorted Array nlogn 的最长非严格单调子序列
Almost Sorted Array Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Ot ...
- python isinstance函数
isinstance是Python的一个内建函数 语法: 1 isinstance(object,classinfo) 如果参数object是classinfo的实例,或者object是classin ...
- BZOJ 4388 [JOI2012春季合宿]Invitation (线段树、二叉堆、最小生成树)
题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=4388 题解 模拟Prim算法? 原题所述的过程就是Prim算法求最大生成树的过程.于是我 ...
- c++ 派生类的构造函数 与 基类构造函数的关系
<面向对象程序设计基础(第二版>李师贤等,第254页:C++语言的基本规则是:创建一个派生类的对象时,如果基类带有构造函数,则先调用基类的构造函数,然后才调用派生类的构造函数. <T ...
- 「前端」尚妆 UI 组件库工程实践(weex vue)
本文来自尚妆前端团队南洋 发表于尚妆github博客,欢迎订阅! 前言 尚妆大前端团队使用 weex 进行三端统一开发有一段时间了,截止本文发表「达人店」APP大部分页面都已经用 weex 进行了重构 ...
- VMware NAT模式设置静态IP(可上网)
在搞电商架构的高并发高可用时,需要在VMware新建几个linux虚拟机,如果使用VMware的默认网络是自动获取的,但有时候启动虚拟机IP地址会改变,使用很不方便,所以就整理一份静态IP地址设置的方 ...
- C# async await and state machine
Async Await and the Generated StateMachine https://www.codeproject.com/Articles/535635/Async-Await-a ...
- Java-JVM 类加载机制
类的生命周期中的第一步,就是要被 JVM 加载进内存,类加载器就是来干这件事. 一.类加载器种类 系统提供了 3 种类加载器: 1.启动类加载器(Bootstrap ClassLoader) 由 C ...
- koa 基础(十六)koa 中 session 的使用
1.app.js /** * koa 中 session 的使用 * 1.npm install koa-session --save * 2.const session = require('koa ...