Linux(五)shell编程基础
一、Linux shell简介
1、shell概述
Shell 是用户与内核进行交互操作的一种接口,目前最流行的 Shell 称为 bash Shell
Shell 是一门编程语言<解释型的编程语言>,即 shell 脚本<就是在用 linux 的 shell 命令编程>,
Shell 是一种脚本语言,那么,就必须有解释器来执行这些脚本。
Unix/Linux 上常见的 Shell 脚本解释器有 bash、sh、csh、ksh 等,习惯上把它们称作一种 Shell。
我们常说有多少种 Shell,其实说的是 Shell 脚本解释器, 可以通过 cat /etc/shells 命令查看系 统中安装的 shell,不同的 shell 可能支持的命令语法是不相同的
2、shell基本格式
代码写在普通文本文件中,通常以.sh 结尾
vi helloworld.sh
#!/bin/bash ## 表示用哪一种 shell 解析器来解析执行我们的这个脚本程序
echo "hello world" ## 注释也可以写在这里
保存退出即可
在这里,我们就写好了一个 shell 脚本, 第一行是固定需要的,表明用哪一种 shell 解析器来 执行我们的这个脚本程序。 本质上, shell 脚本里面的代码都是就是一些流程控制语句加一 些特殊语法再加 shell 命令组成。 其中,我们可以当做每一个命令就是 shell 编程当中的关键 字。
3、shell执行方式
(1) sh 方式
sh helloworld.sh ## 直接指定用系统默认的 bash shell 解释执行
(2) source 方式
source 命令也称为“点命令”,也就是一个点符号( .) ,是 bash 的内部命令。
功能:使 Shell 读入指定的 Shell 程序文件并依次执行文件中的所有语句 source 命令通常用于重新执行刚修改的初始化文件,使之立即生效,而不必注销并重新登录。
用法:source filename 或者. filename 例:source helloworld.sh 或者. helloworld.sh
注意:点和脚本之间是有空格的
(3)直接执行该脚本文件
可以有两种方式,不过这两种方式的执行,都需要该文件有执行权限 所以在执行之前,我们要更改他的执行权限
chmod 755 helloworld.sh
切换到该文件所在的路径下执行命令:./helloworld.sh 或者helloworld.sh
直接以绝对路径方式执行:/root/bin/helloworld.sh
二、shell基本语法
1、系统变量
Linux Shell 中的变量分为“系统变量”和“用户自定义变量”
系统变量可以通过 set 命令查看 常用系统变量: $PWD $SHELL $USER $HOME
2、自定义变量
(1)语法:
变量=值 (例如 STR=abc) 等号两侧不能有空格 变量名称一般习惯为大写
使用变量: $STR
双引号和单引号有区别: 双引号仅将空格脱意, 单引号会将变量引用比如$param 脱意
(2)示例:
解释:
命令: ABC=huang bo,定义变量时中间带有空格,那么一定要带引号,不然会定义不成 功
命令: ABC='huang bo', 带了单引号则原样输出。 表示引号中间的值是整体字符串 在引号当中要引用变量的时候,单引号和双引号就有区别啦:
命令: echo 'xu zheng $ABC' 和 echo "xu zheng $ABC"
请看区别:
如果是单引号,则引号当中的任何东西都当做字符串,即特殊字符会被脱意
如果是双引号, 那么$ABC 能打印出变量的值
那假如命令是这样的: echo "xu zheng $ABCabc",请问还能不能打印出变量 ABC 的值呢? 请看结果:

(3)变量高级用法
撤销变量: unset ABC
声明静态变量: readonly ABC= 'abc' 特点是这种变量是只读的,不能 unset
请先看一个例子, 我现在写两个脚本,在 a.sh 中调用 b.sh 执行,那我们想知道 a 脚本能 不能获取到 b 脚本的变量, b 脚本能不能获取到 a 脚本的变量?

在 a.sh 中只打印出了变量 A 的值,这个好理解,因为 shell 是顺序解析执行的,在打印 变量 B 的时候,就算它能获取到 b.sh 当中的变量,它也还没执行,所以,肯定获取不到
再看 b.sh 打印出来的结果: 可以发现虽然 a.sh 当中的语句执行完了再调用 b.sh 来执 行,但是 b.sh 脚本依然也没法获取到 a.sh 的变量
那怎么解决?
使用 export 关键字
export A="A in a.sh"
意味着把变量提升为当前 shell 进程中的全局环境变量,可供其他子 shell 程序使用, A 变量就成了 a.sh 脚本所在 bash 进程的全局变量,该进程的所有子进程都能访问到变 量 A
另外一种使用方式:
如果在 a.sh 脚本中用如下方式调用 b.sh: . /root/bin/b.sh ## 注意:重点关注最前面那个“ .”号 或者 source /root/bin/b.sh
用上述两种方式意味着: b.sh 就在 a.sh 所在的 bash 进程空间中运行
总结:
1、 a.sh 中直接调用 b.sh,会让 b.sh 在 A 所在的 bash 进程的“子进程”空间中执行
2、而子进程空间只能访问父进程中用 export 定义的变量
3、一个 shell 进程无法将自己定义的变量提升到父进程空间中去
4、 source 或者“ .”号执行脚本时,会让脚本在调用者所在的 shell 进程空间中执行
(4)反引号赋值
a=`ls -l /root/bin` ##反引号,运行里面的命令,并把结果返回给变量 a
另外一种写法: a=$(ls -l /root/bin)
(5)特殊变量
先来看看各个常用的特殊变量的概念:
$? 表示上一个命令退出的状态码
$$ 表示当前进程编号
$0 表示当前脚本名称$n 表示 n 位置的输入参数( n 代表数字, n>=1)
$# 表示参数的个数,常用于循环
$*和$@ 都表示参数列表

注: $*与$@区别
$* 和 $@ 都表示传递给函数或脚本的所有参数
不被双引号" "包含时—— $* 和 $@ 都以$1 $2 „ $n 的形式组成参数列表
当它们被双引号" "包含时—— "$*" 会将所有的参数作为一个整体,以"$1 $2 „ $n"的形式组成一个整串;
"$@" 会将各个参数分开,以"$1" "$2" „ "$n" 的形式组成一个参数列表

三、运算符
1、算数运算符
(1)用expr
格式 expr m + n 或 $((m+n)) 注意 expr 运算符间要有空格
例如计算( 2+3)×4 的值
1、 分步计算 S=`expr 2 + 3`
expr $S \* 4 ## *号需要转义
2、 一步完成计算
expr `expr 2 + 3 ` \* 4
echo `expr \`expr 2 + 3\` \* 4`

(2)用(())
((1+2))
(((2+3)*4))
count=1
((count++))
echo $count
但是要想取到运算结果,需要用$引用 a=$((1+2))
(3)用$[]

四、流程控制
1、if
语法格式:
if condition
then
statements
[elif condition
then statements. ..]
[else
statements ]
fi


[] = 两侧都有空格
短路运算符(理解为三元运算符) [ condition ] && echo OK || echo notok 条件满足,执行&&后面的语句;条件不满足,执行||后面的语句

条件判断组合
条件判断组合有两种使用方式: [] 和 [[]]
注意它们的区别:
[[ ]] 中逻辑组合可以使用 && || 符号
[] 里面逻辑组合可以用 -a -o

常用判断运算符:
(1) 字符串比较
= 判断相等 != 判断不相等 -z 字符串长度是为 0 返回 true -n 字符串长度是不为 0 返回 true

(2) 整数比较
-lt 小于
-le 小于等于
-eq 等于
-gt 大于-ge 大于等于
-ne 不等于

(3)文件判断
-d 是否为目录
if [ -d /bin ]; then echo ok; else echo notok;fi
-f 是否为文件
if [ -f /bin/ls ]; then echo ok; else echo notok;fi
-e 是否存在
if [ -e /bin/ls ]; then echo ok; else echo notok;fi
2、while

3、case

4、for三种方式

5、函数使用

函数调用方式:function hello() 或 function hello 或 hello
注意:
1、 必须在调用函数地方之前,先声明函数, shell 脚本是逐行运行。不会像其它语言一样先 预编译
2、 函数返回值,只能通过$? 系统变量获得,可以显示加: return 返回,如果不加,将以最 后一条命令运行结果,作为返回值。 return 后跟数值 n(0-255)
6、函数参数


案例:打印9*9乘法表

补充:

Linux(五)shell编程基础的更多相关文章
- Linux之shell编程基础
一.变量 变量在shell中分为:本地变量.环境变量.位置参数: 本地变量:仅可在用户当前shell生命期的脚本中使用的变量,本地变量随着shell进程的消亡而无效,本地变量在新启动的shell中依旧 ...
- Linux学习之二十一-shell编程基础
Shell编程基础 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言.Shell 是指一种应用程序,这个应用程序提供了一个 ...
- 【Hadoop离线基础总结】linux的shell编程
linux的shell编程 基本了解 概述 Shell是一个用C语言编写的程序,通过shell用户可以访问操作系统内核服务,它类似于DOS下的command和后来的cmd.exe.Shell既是一种命 ...
- Linux Shell编程基础
在学习Linux BASH Shell编程的过程中,发现由于不经常用,所以很多东西很容易忘记,所以写篇文章来记录一下 ls 显示当前路径下的文件,常用的有 -l 显示长格式 -a 显示所有包括隐 ...
- Linux学习——shell编程之变量
shell编程之变量:Linux shell编程基础中的变量. 包括Bash变量的分类和各变量的详细使用,如:用户自定义变量.环境变量.语系变量.位置参数变量和预定义变量. 1:什么是Bash变量? ...
- 【转】Shell编程基础篇-上
[转]Shell编程基础篇-上 1.1 前言 1.1.1 为什么学Shell Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具, Linux/UNIX系统的底层及基础应 ...
- Linux 下shell 编程学习脚手架
linux body { font-family: Helvetica, arial, sans-serif; font-size: 14px; line-height: 1.6; padding-t ...
- shell编程基础(转载)
Shell编程基础 原作者 Leal:请参阅页面底部的编者列表. 授权许可: 创作共享署名协议 GNU 自由文档许可证 注意:本文仍然在持续的修订之中,且错漏之处可能较多.如果能够阅读英语的话,可以考 ...
- 【Shell 编程基础第二部分】Shell里的流程控制、Shell里的函数及脚本调试方法!
http://blog.csdn.net/xiaominghimi/article/details/7603003 本站文章均为李华明Himi原创,转载务必在明显处注明:转载自[黑米GameDev街区 ...
- shell编程基础(5)---循环指令
while类型的循环 while类型的循环是不定循环的一种,每一次循环都会验证给出的循环条件,判断是否要进行下一次循环.linux中while循环的写法和c语言中很想,但是条件给出的方式有些区别. 首 ...
随机推荐
- 进阶篇:4.1)DFA设计指南:简化产品设计(kiss原则)
本章目的:理解kiss原则,明确如何简化产品的设计. 1.前言:kiss原则,优化产品的第一原则 如果要作者选出一个优化产品的最好方法,那一定是kiss原则莫属.从产品的整体设计到公差的分析,kiss ...
- 论文笔记:Visual Object Tracking based on Adaptive Siamese and Motion Estimation Network
Visual Object Tracking based on Adaptive Siamese and Motion Estimation 本文提出一种利用上一帧目标位置坐标,在本帧中找出目标可能出 ...
- scrapy+selenium+chromedriver解析动态渲染页面
背景:动态页面是页面是通过js代码渲染出来的,无法直接使用scrapy爬虫,这是就需要先把js代码转为静态的html,再用scrapy爬虫就可以解决 解决办法:增加SeleniumMiddleware ...
- Python 数据图表工具的比较
Python 的科学栈相当成熟,各种应用场景都有相关的模块,包括机器学习和数据分析.数据可视化是发现数据和展示结果的重要一环,只不过过去以来,相对于 R 这样的工具,发展还是落后一些. 幸运的是,过去 ...
- JS数据结构学习之排序
在看<>这本书中关于排序这一章的时候,我试着用javascript语言来重写里面几个经典的排序方法,包括冒泡排序.快速排序.选择排序.插入排序还有希尔排序. 一.冒泡排序 冒泡排序算是排序 ...
- 软工第十二周个人PSP
11.30--12.6本周例行报告 1.PSP(personal software process )个人软件过程. C(类别) C(内容) ST(开始时间) ET(结束时间) INT(间隔时间) Δ ...
- 第9次Scrum会议(10/21)【欢迎来怼】
一.小组信息 队名:欢迎来怼小组成员队长:田继平成员:李圆圆,葛美义,王伟东,姜珊,邵朔,冉华小组照片 二.开会信息 时间:2017/10/21 17:20~17:45,总计25min.地点:东北师范 ...
- Python学习之路7 - 生成器&迭代器
本章内容: 列表生成式 生成器 yield 迭代器 列表生成式 当我们要定义一个列表的时候,我们通常用这种方式a = [1,2,3],但是如果我们定义了一个比较长的列表的时候,手动定义列表就会比较麻烦 ...
- struts传值方式ModelDriven的使用
struts传值不需要用到request,struts会处理好. 1.不是面向对象直接在jsp页面和Java代码都写:name,password... 以下为面向对象 2.action类实现Model ...
- 软工网络15团队作业4-DAY8
每日例会 昨天的工作. 张陈东芳:可导入部分类信息,继续尝试将所有信息导入: 吴敏烽:商品类的规范化编写: 周汉麟:界面的排版继续优化: 林振斌:按照浏览历史,次数等,继续优化商品类排序: 李智:研究 ...