Linux之bash编程基本语法
在Linux运维工作中,我们为了提高工作效率通常会用bash编写脚本来完成某工作。
今天就来为大家介绍bash的一些常见的基本语法。
在讲解bash语法之前首先介绍一下bash。
bash环境主要是由解释器来完成的。
【解释器】:解释命令:词法分析、语法分析、语义分析
条件判断:选择分支
循环
注:bash是一种过程是编程语言:顺序执行、选择执行、循环执行
解释器:提供了编程环境
【脚本】:使用bash提供控制机制,将期望执行的命令罗列于文本文件中,当我们需要执行脚本中的命令时我们可以只用执行该脚本即可。
注:bash没有库,整个程序几乎都要依赖于系统命令来完成
编译型语言:源程序转换成二进制源(文本文件)--> 预处理 --> 编译 --> 汇编 --> 链接
注:编译型语言是静态语言(需要声明变量)
解释型语言:源程序(文本文件)--> 解析器去读取并执行
注:解释型语言是动态语言(变量无需声明,随拿随用)
bash的重要特性:变量
bash变量类别:
本地变量:只对当前shell进程有效的变量;对其它shell进程无效,包当前shell进程的子进程;
环境变量:对当前shell进程及其子shell有效,对其它的shell进程无效;
局部变量: 对shell脚本中某代码片断有效;通常用于函数本地;
位置变量:如$1,表示引用第一个参数;
特殊变量:如$?,表示返回上一条命令执行状态的返回值。
变量的赋值:变量名=变量值 如我们给变量abc赋值为123:abc=123
注:变量赋值是向变量存储空间保存数据
变量的引用:${变量名} 如我们想引用变量abc:${abc}
“”表示弱引用,如果里面是变量的话将会被替换成变量的值 如我们用“”引用abc:“abc” 显示的结果为123
‘’表示强引用,如果里面是变量的话将会直接输出不做替换 如我们用‘’引用abc:‘abc’显示结果为:abc
定义环境变量:export 变量名=变量值 如定义一个环境变量chioce:export chioce=1213
导出环境变量:export 变量名 如导出变量chioce:export chioce
撤销环境变量:unset 变量名 如我们撤销变量chioce:unset chioce
定义为只读变量:readonly 变量名 如我们把chioce定义为只读变量:readonly chioce
定义局部变量:local 变量名=变量值 如我们定义一个局部变量sum:local sum=123
查看本地变量:set
查看环境变量:export、printenv、env
注:我们在定义变量时变量名的命名要遵循以下要求:
1、不能使用程序中的关键字 如:if、case、for等;
2、只能使用数字、字母和下划线,且不能以数字开头;
3、要见名知义(看见变量名就知道这个变量是用来干什么的)。
【bash脚本格式】:
开头一行必须为:#!/bin/bash(只有这样程序才能识别这是一个bash脚本)
bash编写完脚本后我们可用:bash -n 脚本名 (对脚本进行语法测试)
bash -x 脚本名 (单步模拟执行该脚本)
bash 脚本名 (运行该脚本)
注:脚本运行前是没有可执行权限的,我们需要给脚本执行权限后才能执行:chomd +x 脚本名
既然说了脚本的简单用法接下来我们做一个实例给大家演示一下:
【实例1】
写一个脚本,能接受一个参数作为用户名,此脚本可创建此用户,并且其密码同用户名;
具体操作我们就演示这一次,之后的实例只做模拟不再具体操作。
这样是方便了我们处理一些事情,但是对于有些大量的重复的操作怎么办?难道我们还要这样手动一条一条的写进脚本吗?是不是有点麻烦?
所以我们的循环语句就出现了
【bash之for循环】
For循环的语法格式:for 变量 in 列表(列表中包含1个或多个元素)
do
循环体
done
注:每次循环都会把列表中的元素赋值给变量执行循环体。
for循环的退出条件是遍历列表结束,(也就是说所有列表中的元素都执行一遍后就结束)
【实例2】:写一个脚本,创建10个用户,分别为user301..user310
【实例3】:写一个脚本
1、创建用户tuser1-tuser9;
2、创建目录/tmp/dir-当前日期时间;
3、在/tmp/dir-当前日期时间 目录中创建9个空文件file101-file109
4、将file101的属主改为tuser1,依次类推,一直将file109的属主改为tuser9;
【for循环列表的生成方法】:
实例2中我们用到了{301..310} 意思为:从301开始一次加1,一直到310
如果我们需要的偶数呢,或者是每隔3个取一个数呢?
${seq 301 2 310}表示从301开始每隔一个数取一个,到310为止。
【列表生成方式】:1、手动添加 如:for i in 1 2 3 4 5
2、数值列表 如:{起始值..结束值} $(seq 起始值 递进值 结束值)
3、通过位置参数传递 如:$*,$@
4、命令生成列表 如:ls /etc/
【实例4】:写一个脚本计算100以内所有偶数之和
【bash的运算方式】:
算数运算:let 变量=a+b 如实例4中的let sum=$sum+$i或者let sum+=$i
Bash中支持的算术运算符:+、-、*、/、%(取余)、**(次方)、+=、—=、/=、%=、*=、变量++、++变量、变量--、--变量
逻辑运算:&&(与运算)、||(或运算)、!(非运算)
比较运算:<、>、<=、>=、==、!=
【bash的测试类型】
整型测试:-gt 大于 如:[ $a -gt $b ] 判断$a是否大于$b
-lt 小于
-ge 大于等于
-le 小于等于
-eq 相等
-ne 不等
字符串测试: <
>
<=
>=
== :等值
!= :不等值
-n ‘字串’:是否为不空 如: [ -n $a ] 判断$a是否为不空
-z ‘字串’:是否为空 如:[ -z $a ] 判断$a是否为空
=~ :模式匹配 如:[[ ‘$a’ =~ ‘yes’ ]]判断$a的内容是否为yes
【bash之if语句】:
语法格式:1、(单分支if)if 测试条件
then
选择分支
fi
2、(双分支if)if 测试条件
then
选择分支1
else
选择分支2
fi
3、(多分支if)if 测试条件1
then
选择分支1
elif 测试条件2
then
选择分支2
.
.
.
else
选择分支n
fi
【实例5】:写一个脚本,给定一个用户,如果其shell为/bin/bash且其ID号大于等于500,则说这是一个可登录普通用户;否则,则显示其为非登录用户或管理员。
【实例6】:写一个脚本,1、添加10个用户:tuser501-tuser510
如果用户不存在,才添加;如果存在,则显示已经有此用户
2、显示一共添加了多少个用户;
【bash条件测试之文件测试】:
使用格式:[ 条件 文件 ]
条件:-a 文件是否存在(也可以判断目录)
-e 与-a相同
-f 文件存在并且为普通文件
-d 存在,且为目录
-h 存在,且为符号链接文件 同-L
-b 块设备
-c 字符设备
-S 套接字文件
-p 管道文件
-s 存在且为非空文件
-r 存在且可读
-w 存在且可写
-x 存在且可执行
File1 -nt file2 文件1的mtime时间比文件2的mtime时间新
File1 -ot file2 文件1的mtime时间比文件2的mtime时间老
【实例7】:写一个脚本, 给定一个文件路径
1、判断此文件是否存在;不存在,则说明文件不存,并直接结束脚本;
2、如果文件是否普通文件,则显示为“regular file”;
如果文件是目录,则显示为“directory”;
如果文件是链接文件,则显示为“Symbolic file";
否则,则显示为“unknown type.”
【bash编程之交互式编程】:
格式:read -p “输入提示内容.” 变量名
【实例8】:写一个脚本,输入用户名,可返回其shell
【实例9】写一个脚本,显示一个如下菜单给用户:
cpu) show cpu infomation
mem) show memory infomation
*) quit
1、如果用户选择了cpu,则显示/proc/cpuinfo文件的内容;
2、如果用户选择了mem,则显示/proc/meminfo文件的内容;
3、退出
【bash编程循环之while和until】:while和until用于循环次数未知的情况下
语法格式:while 测试条件
do
循环体
done
如果测试结果为真则进入循环,退出条件:测试条件为假
语法格式:until 测试条件
do
循环体
done
如果测试结果为假则进入循环,退出条件:测试条件为真
【实例10】写一个脚本,求100以内所有正整数之和
【实例11】:写一个脚本,:写一个脚本
1、提示输入一个对其执行分区的新硬件设备文件;
2、提醒用户接下来的操作销毁所有的数据,你继续吗?
y或yes: 继续
n或no:退出
其它字符:提醒输错了,再来一次;
3、对磁盘新建分区:
主分区1:大小512M,
主分区2:大小2G
4、创建完成后显示创建的结果;
【bash编程之for循环的其他用法】:
语法格式:for ((初始条件;测试条件;修改表达式))
do
循环体
done
【实例12】写一个脚本,求100以内所有正整数之和
【bash编程之while遍历文本文件】:
语法格式:while read 变量
do
循环体
done
【实例13】:写一个脚本,显示其ID号为偶数的用户的用户名、ID号和SHELL
【bash编程之case语句】
case语句:有多个测试条件时,case语句会使得语法结构更加明晰
语法格式:case 变量引用 in
条件1)
分支1
;;
条件2)
分支2
;;
.
.
.
条件n)
分支n
;;
esac
【实例14】写一个脚本,用户键入字符后判断其所属的类别
【bash编程之函数】:
将代码模块化,代码可重复使用
语法格式:function 名
{
函数体
return #(#表示数字)
}
可调用,使用函数名调用,函数名出现的地方,会自动替换成函数体。
结果返回值打印语句:echo、print
【实例15】:写一个脚本,完成如下功能(使用函数):
1、提示用户输入一个可执行命令;
2、获取这个命令所依赖的所有库文件(使用ldd命令);
3、复制命令至/mnt/sysroot/对应的目录中
解释:假设,如果复制的是cat命令,其可执行程序的路径是/bin/cat,那么就要将/bin/cat复制到/mnt/sysroot/bin/目录中,如果复制的是useradd命令,而useradd的可执行文件路径为/usr/sbin/useradd,那么就要将其复制到/mnt/sysroot/usr/sbin/目录中;
4、复制各库文件至/mnt/sysroot/对应的目录中;
【bash编程之循环控制】:
continue :提前进入下一轮循环(用于条件语句,仅在某个特殊场景提前进入)
break :跳出当前循环(用于条件语句,仅在某个特殊场景跳出循环)
【bash编程之数组】:
数组:数组名+索引 来标记数组元素
索引表示方式:数字索引 如:a[0]、a[1]...
引用数组:${a[0]}
declare -a 数组 定义数组
-A 关联数组
支持稀疏数组: a[0] a[7] a[9]...(仅支持一维数组,数组补课再次划分)
数组的赋值:一次对一个元素赋值:a[0]=$RADOM ($RADOM是bash内置的一个生成随机数的变量)
一次对全部元素赋值:a=(red blue yellow green)
按索引进行赋值:a=([0]=green [3]=red [2]=blue [6]=yellow)
命令替换:a=(/var/log/*.log)
用户输入:read -a +数组名
显示数组的长度:${#数组名[*]} 或${#数组名[@]}
${#数组名} 默认显示数组中的第一个元素
从数组中挑选某元素:${数组名[@]:偏移元素个数:取出的元素个数}
${数组名[*]} 取出所有元素
数组复制:${数组名[@或者*]}
$@:把所有参数都当成字符串,一个参数一个串
$*:所有参数都是一个串
删除数组中的一个元素:unset 数组名[下标]
字符串切片:${字串名:#:#} 取字串中偏移#个的#个字符
${字串名: -#} 取尾部指定个数的字符
${字串名#*Word} 在字串上,自左而右,查找第一次出现word,删除字符开始至此word处的所有内容
${字串名##*Word} 在字串上,自左而右,查找最后一次出现word,删除字符开始至此word处的所有内容
${字串名%Word*} 在字串上,自右而左,查找第一次出现word,删除此word处至字串尾部的所有内容
${字串名%%Word*} 在字串上,自右而左,查找最后一次出现word,删除此word处至字串尾部的所有内容
查找替换:${变量名/查找内容/替换内容} 只替换第一个
${变量名//查找内容/替换内容} 替换全部
${变量名/#查找内容/替换内容} 替换行首的指定字串
${变量名/%查找内容/替换内容} 替换行尾的指定字串
查找删除:${变量名/删除内容} 删除第一次出现的指定内容
${变量名//删除内容} 删除指定的全部内容
${变量名/#删除内容} 删除行首出现的指定内容
${变量名/%删除内容} 删除行尾出现的指定内容
大小写替换:${变量名^^x} 把指定的x字符替换成大写
${变量名,,x} 把指定的x字符替换成小写
变量赋值: ${变量名:-Word} 如果变量为空,则显示结果为Word,(不给变量赋值,仅是显示结果改变)如果不空,则显示原值。
${变量名:=Word} 如果为空,则赋值并输出Word,如果不空,则显示原值。
${变量名:+Word} 如果不空则显示Word,如果为空则不显示。
${变量名:?Word} 如果为空则显示错误信息Word
【实例16】写一个脚本,生成10个随机数,升序排序
【实例17】写一个脚本,打印九九乘法表。
好了以上就是bash的基本语法内容了。
转载于:https://blog.51cto.com/8455162/1535037
相关文章:
深度学习中的卷积网络简介
卷积网络(convolutional network)也叫做卷积神经网络(convolutional neural network, CNN),是一种专门用来处理具有类似网格结构的数据的神经网络。例如时间序列数据(可以认为是在时间轴上有规律地采样形成的一维网格)和图像数据(可以看作是二维的像素网格)。卷积网…

Windows下搭建PHP开发环境
PHP集成开发环境有很多,如XAMPP、AppServ......只要一键安装就把PHP环境给搭建好了。但这种安装方式不够灵活,软件的自由组合不方便,同时也不利于学习。所以我还是喜欢手工搭建PHP开发环境,需要哪个模块自己安装就行了,…

大数据时代下的新生态、新洞察、新趋势 | 神策 2019 数据驱动大会
10 月 22 日,以“矩•变”为主题的神策 2019 数据驱动大会在北京维景国际大酒店顺利举行,来自全球大数据各大行业的领袖人物聚首北京,融合国际前沿技术与行业实践,深入探讨大数据时代下的新生态、新洞察、新趋势。 大会主题“矩•…

ckedit 文本编辑器
Ckeditor是一个功能非常强大的富文本编辑器,博客园有使用此编辑器,其功能完全可以与MS的Word媲美。 用起来也非常方便。下面是本人总结的安装步骤: 第一步,从http://ckeditor.com/download 下载ckeditor文件包 第二步,…

为什么我害怕数据结构学得好的程序员?
我害怕数据结构学得好的程序员,一跟他们讨论技术,我就感觉自己不是程序员,仅仅是在搬砖维持生活。我所拥有的编程技巧是什么?不就是每个程序员都会的,对数据库的增删改查吗?每一个初入职场的程序员都会。但…

Go语言基础介绍
Go是一个开源的编程语言。Go语言被设计成一门应用于搭载Web服务器,存储集群或类似用途的巨型中央服务器的系统编程语言。目前,Go最新发布版本为1.10.Go语言可以运行在Linux、FreeBSD、Mac OS X和Windows系统上。1. 结构:Go语言的基础组成有以…

强制退出WinForm程序之Application.Exit和Environment.Eixt
这几天在做一个把大量Infopath生成的XML数据,进行处理的程序,我用了MDI子窗体,每个窗体包含了各自的功能,如,遍历目录及其子目录检查文件类型并自动生成Sql语句并入库、对Infopath数据的自动检查、对数据中的某些域的替…

Oracle Study之--Oracle等待事件(3)
Oracle Study之--Oracle等待事件(3)Db file parallel read这是一个很容易引起误导的等待事件,实际上这个等待事件和并行操作(比如并行查询,并行DML)没有关系。 这个事件发生在数据库恢复的时候,…
Windows下通过Python 3.x的ctypes调用C接口
在Python中可以通过ctypes来调用动态库中的C接口,具体操作过程如下:1. 使用vs2013创建一个加、减、乘、除的动态库,并对外提供C接口,code内容如下:math_operations.hpp: #ifndef TEST_DLL_1_MATH_OPERATIONS_HPP_ #def…

如何在3天内拿下DigSci大赛的亚军?| DigSci科学数据挖掘大赛
作者 | 朱翔宇(DOTA)来源 | AI算法之心(AIHeartForYou)【导读】本文将基于作者在中国计算机大会方案宣讲PPT中的内容,给出此次比赛的完整方案,主要从赛题理解、建模核心思路、算法核心思想等角度阐述,同时对相关细节进…

如何获得Oracle系统性能统计? Oracle大型数据库系统在AIXUNIX上的实战详解 集中讨论 14...
累计读者的来信中,有若干位同仁谈到Oracle的性能问题。什么叫性能慢?怎么量化性能统计?问题我不一一列出了,下面的文字大部分来自Oracle 英文文档,我认为描述的极为精确,比我说的强。 如果有效地诊断性能问…

百度搜索查询命令——组合型
在百度上搜索一下,就会出现一堆关于查询搜索的命令,比如:site,domain,双引号,减号等等。今日,我简单总结一点组合型命令,希望对大家有帮助。 1、domain命令、减号-和的inurl组合 公式…

Delphi多线程编程中的技巧
1)创建线程 MsgThread : TMsgThread.Create(False) ; //创建并执行线程 MsgThread : TMsgThread.Create(True) ; //创建线程后挂起 constructor Create(CreateSuspended: Boolean); 中的参数CreateSuspended表示创建后是否挂起线程。 (2)设置…
Ubuntu14.04下配置OpenGL及测试代码
ubuntu14.04 64位下,默认是没有安装OpenGL相关依赖库的,若安装,则依次执行如下几条命令即可: $ sudo apt-get update $ sudo apt-get install build-essential $ sudo apt-get install libgl1-mesa-dev $ sudo apt-get install li…

VarGFaceNet:地平线提出轻量级、有效可变组卷积的人脸识别网络
作者 | Mengjia Yan、Mengao Zhao、Zining Xu、Qian Zhang、Guoli Wang、Zhizhong Su译者 | 刘畅编辑 | Jane出品 | AI科技大本营(ID:rgznai100)【导读】为了提高用于人脸识别的轻量级网络的判别和泛化能力,本文提出了一种有效的可…

【TortoiseSVN使用教程】
TortoiseSVN使用教程 TortoiseSVN是一个SVN的客户端 1.Checkout Repository 首 先要Checkout服务器端的Repository,所谓的Checkout就是指获得服务器端指定的Repository。存储的所有文件这个 Checkout和Visual Source Safe的Checkout意义完全不一样࿰…

[ASP.NET MVC 小牛之路]10 - Controller 和 Action (2)
继上一篇文章之后,本文将介绍 Controller 和 Action 的一些较高级特性,包括 Controller Factory、Action Invoker 和异步 Controller 等内容。 本文目录 开篇:示例准备 文章开始之前,我们先来了解一下一个请求的发出到Action方法处…
Linux下遍历指定目录的C++实现
之前在 https://blog.csdn.net/fengbingchun/article/details/51474728 给出了在Windows遍历指定文件夹的C实现,这里给出在Linux下遍历目录的实现,Windows和Linux下的实现都是参考了OpenCV 2.x中的实现,OpenCV中的用法可参考https://blog.csd…

要活102年,阿里凭借的是什么?
由浅到深、由轻到重、由拥抱到创新,看似“风平浪静”的历史背后,中国互联网江湖的发展实则“波涛汹涌”。对于身处核心位置的科技巨头阿里巴巴而言,将如何更好地去实现“希望活 102 年”的愿景?凭借的究竟又是什么?作者…

Go基础知识学习(6) 接口
2019独角兽企业重金招聘Python工程师标准>>> Golang接口定义使用interface来声明,它相对于其他语言最大的特定就是接口定义和实现的关联性仅仅依赖接口的名字和声明,无需显式声明。 接口定义和实现 在下面这个例子中,定义了两个自…

多模态数据+知识图谱,这次你的疑难杂症有解了!
数据是AI的基础,不同行业领域的数据来源广泛、形式多样,其每一种来源或形式都可以看作是一种模态,例如视频、图片、语音以及工业场景下的传感数据,红外、声谱等。多模态数据的语义理解与知识表示让智能体能更深入地感知、理解真实…
Linux下通过gettimeofday函数获取程序段执行时间
在Linux下计算某个程序段执行的时间一般使用gettimeofday函数,此函数的声明在sys/time.h文件中。此函数接收两个结构体参数,分别为timeval、timezone.两个结构体的声明如下:struct timeval {time_t tv_sec; /* seconds */long tv_usec; /* mi…

matlab练习程序(Log Polar变换)
Log Polar就是所谓的极坐标变换,通过变换能将笛卡尔坐标系中的图像映射到极坐标系中。 确切的来说我这里不算是Log Polar,因为Log Polar是将图像从(x,y)映射到(log(r),theta),而我是将图像从(x,y࿰…

SiteMapPath基本用法
1、添加一个网站地图项 Web.sitemap项 2、在 Web.sitemap项的写法如下: <?xml version"1.0" encoding"utf-8"?><siteMap xmlns"http://schemas.microsoft.com/AspNet/SiteMap-File-1.0"><siteMapNode url"defa…

closurescallbacks
引用文章原文地址:(声明:文章只为自己总结知识,内容东拼西凑,版权归以下作者所有。) 1. Wikipedia: callback(computer science) 2. Implement callback routines in Java By John D. Mitchell, JavaWorld.…
吴恩达老师深度学习视频课笔记:卷积神经网络
计算机视觉:包括图像分类(image classification)、目标检测(object detection)、风格迁移(neural style transfer)等等。边缘检测示例:神经网络的前几层可以检测边缘,然后后面几层可能检测到物体的部分,接下来靠后的一些层可能检测…

COCO 2019挑战赛,旷视研究院拿下三项计算机识别冠军 | ICCV 2019
出品 | AI科技大本营(ID:rgznai100)10月27日,两年一度的国际计算机视觉大会ICCV 2019(InternationalConference on Computer Vision)在韩国首尔开幕。作为ICCV 2019重头戏,COCO 是人工智能领域最具影响力的…

runners学习
runners是由salt-run命令调用的,一般我用的到就是jobs和manage模块。源代码是在./site-packages/salt/runners/下的。当然我们可以自定义runners。先谈谈jobs模块。包含active、lookup_jid、list_job、list_jobs、print_job五种方法。salt-run jobs.active ->返回…
Swift基础 - - 高德地图实践
高德地图开发需要自己到官网http://lbs.amap.com/console/ 注册一个ak,新建一个swift工程,然后在Info.plist中添加一个NSLocationAlwaysUsageDescription或者NSLocationWhenInUseUsageDescription。 高德地图的库以及依赖库加入到项目里面 需要的库如下…

Shell脚本示例代码
1. echo_printf_usage.sh: echo和printf的用法 #! /bin/bash# echo和printf的用法# echo是用于终端打印的基本命令.在默认情况下,echo在每次调用后会添加一个换行符 echo "hello, beijing" echo "$(pwd)" echo $(pwd) # 结果并不是希望得到的,将会输出: $…