bash shell编程

命令行编辑

光标跳转

^a 跳到命令行首

^e 跳到命令行尾

^<- 向左跳转一个单词

^-> 向右跳转一个单词

^b    左移一个字符

^f    右移一个字符

删除

^u 删除光标至命令行首的内容

^k 删除光标至命令行尾的内容

^d 删除光标所在处的字符

^h  = BackSpace功能

^l  清屏

Bang (!) 命令

!!     执行上一条命令

!blah    执行最后一次以blah开头的命令

!$    上一条命令的最后一个参数 (Esc+. 和Alt+.都是效果相同的 引用最后一个参数)

!*     上一条命令的所有参数


history     查看命令历史(用户正常退出时,命令历史会保存到用户目录中的.bash_history)

-c     清除命令历史

-d OFFSET [N]  删除指定位置的命令历史

-w  保存命令历史到历史文件(默认为.bash_history   history -w FileName 也可以保存指定的文件中)

命令历史的使用技巧

!N    执行第N条命令

!-N    执行倒数第N条命令

!!    执行上一条命令

!KEY    执行历史命令中最后一条以KEY关键字开头的命令

环境变量    

PATH:    命令搜索路径

HISTSIZE     命令历史缓冲区大小 (默认为1000)

 

命令别名 (仅在当前shell生命周期中有效,别名的有效范围仅为当前shell进程)

alias

alias CMDALIAS=‘COMMAND [options] [arguments]‘

取消别名

unalias CMDALAS

使用别名原意的

\CMDALIAS

命令替换

把命中某个子命令替换为其执行结果的过程

格式  1、$(COMMAND)   2、`COMMAND`

bash支持的引号

1、 双引号 “”弱引用,可以实现变量替换。用双引号将文本括起来可以阻止shell对大多数特殊字符进行解释。eg 在双引号中括号并不是注释的开通它只是表示一个普通的符号#。然而$ ` 和“字符仍然保持着它的特殊含义,对于这些字符使用\ 可以去除他们的特殊含义

2、单引号   ‘ ‘ 强引用,不完成变量替换。 阻止所有字符的转义

3、反引号  ` `    进行命令替换。在反引号内的shell命令将会被执行(另一种也可以执行shell命令的为  $(COMMAND)  ),其结果输出替换反引号括起来的内容

文件名通配符  globbing

?    匹配文件名中的任意单一字符  (正则表达式中 表示匹配前一个字符的零次或一次)

*    匹配文件名中任何字符串,包括空字符  (正则表达式中 表示匹配前一个字符的零次或多次)

[…]    匹配[]中所包含的任意单一字符

[!…] 和[^…]   匹配[]中非感叹号!之后的字符

  字符集合:(man 7 glob 可以获得以下帮助)

[:space:]    空白字符集

[:punct:]    标点符号

[:lower:]    小写字母

[:upper:]    大写字母

[:alpha:]    大小写字母

[:digit:]      数字

[:alnum:]    数字和大小写字母

[:graph:]    非空字符(非空格和控制字符)

[:print:]       类似[:graph:] ,但是包括空格

[:cntrl:]        控制字符

[:xdigit:]      允许十六进制格式的数字

例如: [[:alpha:]]*[[:space:]]*[[:alpha:]]    表示文件中包含空白字符的

[^[:digit:]]*    表示以非数字开头的

站在用户登录的角度来说,shell的类型

登陆式shell:

正常通常登陆终端登录

su - USERNAME

su -l USERNAME

非登陆式shell:

su USERNAME

图形终端打开的shell

自动执行的shell脚本

bash的配置文件:(全局配置和个人配置都有相同的以作用范围小为准)

全局配置

/etc/profile, /etc/profile.d/*.sh, /etc/bashrc

个人配置

~/.bash_profile, ~/.bashrc

profile类的文件

设定环境变量

运行命令或脚本

bashrc类的文件

设定本地变量

定义命令别名

登陆式shell如何读取配置文件

/etc/profile ——> /etc/profile.d/*.sh ——> ~/.bash_profile ——> ~/.bashrc ——> /etc/bashrc

非登陆式shell读取配置文件流程

~/.bashrc ——> /etc/basrc ——> /ec/profile.d/*.sh


echo命令介绍

echo [-ne]    字符串

-n  不要在最后自动换行

-e   激活转义字符

转义字符

\a 发出警告声
\b
删除前一个字符

\c
最后不加上换行符

\f  \v 换行但光标仍旧停留在原来的位置

\n

换行且光标移至行首
\r 光标移至行首,但不换行

\t

插入tab

\\

插入\

echo -e "\033[40:35m  输出文本”输出文本颜色显示


背景色范围:40-49

字体颜色范围:30-39

40:黑色


30:黑色


41:深红


31:红


42:绿色


32:绿色


43:黄色


33:黄色


44:蓝色


34:蓝色


45:紫色


35:紫色


46:深绿


36:深绿


47:白色


37:白色

 编译器,解释器

编程语言:机器语言、汇编语言、高级语言

变量类型 特点 语言类
静态语言 强类型  变量在使用前,必须事先声明,甚至还需要初始化 编译型语言  事先转换成可执行的格式  C ,C++ ,JAVA ,C#
动态语言 弱类型  变量用时声明,甚至不区分类型 解释型语言 边解释边执行 asp,aps.net,php ,shell 
python ,perl

编程模型

面向过程

面向对象

bash变量类别:

环境变量(全局变量):

本地变量(局部变量):

位置变量:

特殊变量:

注:1、脚本在执行时会启动一个子shell进程

2、命令行中启动的脚本会继承当前shell环境变量

3、系统自动执行的脚本(非命令行启动)就需要自我定义需要各环境变量

环境变量(全局变量) 作用域为当前shell进程及其子进程,

export VARNAME=VALUE

VARNAME=VALUE;export VARNAME

本地变量:作用域为当前shell进程

VARNAME=VALUE

局部变量:作用域为当前代码段

local VARNAME=VALUE


位置变量

$0 获取当前执行的shell脚本的文件名,包括脚本路径

$n 参数或者命令本身,$1 表示脚本的第一个参数

$* 参数列表(整体)

[email protected] 参数列表

$# 参数的个数

$_  表示命令的最后一个参数

shift n 参数从左边依n踢出(在脚本中使用shift 参数1会踢出,之前参数2变成参数1)

特殊(预定义)变量

$? 上一条命令执行状态的返回值(0-255,0:正确执行, 2-权限拒绝、126-找到命令,但是无法执行 127-未找到该命令  系统预留)

$$ 所运行命令的PID

$!    代表最后执行的后台命令的PID

撤销变量

unset VARNAME

查看当前shell中变量(环境变量和本地变量)

set

查看当前shell中的环境变量

env

export

printenv

变量引用方式:

1、  ${VARNAME}

2、 $VARNAME

命令替换

1、·command`

2、$(command)

变量类型:(事先确定数据的存储格式和长度)

字符型

数值型

整型

浮点型

布尔型

变量赋值

VAR_NAME=VALUE

变量子串的常用操作

表达式 说明
${#string} 返回$string 的长度
${string:position} 在$string中,从位置$position之后开始提取子串
${string:position:length} 在$string中,从位置$position之后开始提取长度为length子串
${string#substring} 从变量$string开头开始删除最短匹配$substing子串
${string##substring} 从变量$string开头开始删除最长匹配$substring子串
${string%substring} 从变量$string结尾开始删除最短匹配$substring子串
${string%%substring} 从变量$string结尾开始删除最长匹配$substring子串
${string/substring/replac} 使用$replac 来代替第一个匹配的$substring
${string/#substring/replac} 如果$string 前缀匹配$substring 就用$replace 来代替匹配$substring
${string/%substring/replac} 如果$string 后缀匹配$substring 就用$replace 来代替匹配$substring

逻辑运算

与运算 &&

或运算 ||

非运算 !

异或运算

条件测试的表达式:

[ expression ]    命令测试

test expression

[[ expression ]]  关键字测试

条件测试类型:

类型 表达式 描述
整数测试  
[ num1 OPERATOR num2 ]
-qe  测试两个数是否相等 equal
-ne 不等于 not equal
-gt 大于 greater than
-ge 大于等于 greater equal
-lt 小于 less than
-le 小于等于 less equal
== 是否等于
字符测试
[ char1 OPERATOR char2 ]
!= 不等于
-z  string 测试字符串是否为空,空则真,不空为假
-n string 测试指定字符串是否不为空
文件测试 
[ OPERATOR file | dir ]
-e 目标是否存在
-d 是否为目录
-f  是否为文件
-r 是否有读权限
-w 是否有写权限
-x 是否有执行权限
逻辑测试
[ 表达式1 ] OPERATOR [ 表达式2 ]
-a 或 && 逻辑与 第一个条件为假时,第二个条件不用再判断,最终结果为假
-o 或 || 逻辑或 第一个条件为真时,第二个条件不用再判断,最终结果为真
! 逻辑非

定义脚本退出状态码

exit 退出脚本

exit n    设定退出状态码

如果脚本没有明确定义退出状态码,那么,最后执行的一条命令的状态码即为脚本的状态码

bash中可以判断语法错误的语句(不完全可靠)

bash -n 脚本名  语法错误测试

bash -x 脚本名  (逐步执行语句) set +|- 可以开启关闭功能 -o 可以查看

shell中如何进行算术运算

a=3

b=6

1、let 算术运算表达式

let c=$a+$b

let SUM+=$i

let I+=1、  I++

let I -=1、  I--

2、$[算术运算表达式]

c=$[$a+$b]

3、$((算术运算表达式))

c=$(($a+$b))

4、expr 算术运算表达式 (表达式中各操作数及运算符之间要有空格,而且要使用命令引用)

c=`expr $a + $b`

面向过程

控制结构

顺序结构

选择结构

循环结构

A、选择结构

if:单分支,双分支,多分支

case语句:多分支

一、if判断语句

1、单分支if语句

if 判断条件;then

statement1

statement2

.....

fi

2、双分支if语句

if 判断条件;then

statement1

statement2

.....

else

statement3

statement4

.....

fi

3、多分支if语句

if 判断条件1;then

statement1

.....

elif 判断条件2

statement2

......

elif 判断条件3

statement3

......

elif 判断条件4

statement4

......

else

statementN

......

fi

二、case语句:

case SWITCH in

value1)

statement

...

;;

value2)

statement

...

;;

...

*)

statement

...

;;

esac

B、循环结构 (循环:进入条件,退出条件)

for:

while:适用于循环次数未知的场景,要有条件满足退出循环

until

一、for循环

1、for 变量 in 列表;

do

循环体

done

2、for ((expr1;expr2;expr3));do

循环体

done

如何生成列表

{1..100}

`seq 起始数 步进长度 结束数`

二、while循环

进入循环:条件满足

退出循环:条件不满足

while CONDITION;do

statement

...

done

三、until循环

进入循环:条件不满足

退出循环:条件满足

until CONDITION;do

statement

...

done

三种方式清空文件的方式

#echo  > FileName      (次操作会添加一个空行)

#> FileName

#cat /dev/null >FileName

shell脚本开发基本规范及习惯

1)开头指定脚本解释器   #!/bin/bash

2) 开头田间版本等信息

#Author:wp

#Date: 20160719

#Mail:[email protected]

#Description:This is test

3)代码书写习惯

1、成对出现内容一次写出来,如

[]、{}、“”、‘’

2、流程控制语句一次写出来,再添加控制中的内容,如if、for、

if   条件内容;then

内容

fi

3、流程控制需要缩进方式


shell函数

function 函数名()

{

命令1

命令2

……

}

函数的参数传递

时间: 2024-12-23 17:08:10

bash shell编程的相关文章

GNU Bash Shell 编程图解笔记

bash,Unix shell的一种,在1987年由布莱恩·福克斯为了GNU计划而编写.1989年发布第一个正式版本,原先是计划用在GNU操作系统上,但能运行于大多数类Unix系统的操作系统之上,包括Linux与Mac OS X v10.4都将它作为默认shell.它也被移植到Microsoft Windows上的Cygwin与MinGW,或是可以在MS-DOS上使用的DJGPP项目.在Novell NetWare与Andriod在上也有移植.1990年后,Chet Ramey成为了主要的维护者

Bash shell编程基础

1.何谓shell script shell script是利用shell的功能写一个"程序",这个程序是使用纯文本文件,将一些shell的语法与命令(包括外部命令)写在里面,搭配正则表达式,管道命令与数据流重定向,条件判断语句等功能,以达到我们所想要的处理目的. 2.脚本或程序源文件都是纯文本文件. 3.脚本或程序的执行一般有两种方式: 编译执行:预处理-->编译-->汇编-->链接:编译执行是一种计算机语言的执行方式. 由编译程序将目标代码一次性编译成目标程序,再

Bash shell 编程

一.Bash shell是什么 shell是什么,Bash与shell又有什么关系.(以前我也不是特别清楚~~~~) shell 是一个交互性命令解释器.shell独立于操作系统,这种设计让用户可以灵活选择适合自己的shell.shell让你在命令行键入命令,经过shell解释后传送给操作系统(内核)执行. shell 是一个命令处理器(command processor)--是一个读入并解释你输入的命令的程序.除了是一个命令中断器以外,shell还是一个程序设计语言.你可以编写shell可以解

Bash shell编程的语法知识点(1)

Bash shell脚本编程知识点如下(初学,不全,欢迎讨论补充): shell简介 脚本的简单介绍 变量和引用 算术运算 交互式编程 选择判断 条件测试 循环 函数 shell简介 shell是一种具备特殊功能的程序,提供了用户与内核进行交互操作的一种接口,它接收用户输入的命令,并把它送入内核去执行,shell分为图形界面和命令界面(我们操作的window系统就是一种图形化shell,我们要学的bash也是she一种命令界面的shell). shell与内核和用户的关系图如下: bash sh

Bash Shell编程要点小结

一.case命令 case variable invalue1) command(s);; value2) command(s);; *) command(s);; esac 如果case变量没有被匹配,程序就执行*)后面的语句.case值中允许出现Shell通配符和竖线(|)作为OR操作符 二.if命令 if commandthen command(s) fi if test expressionthen command(s) fi if [ string/numeric expression

Linux Bash Shell编程快速入门

BASH 的基本语法 最简单的例子 -- Hello World! 关于输入.输出和错误输出 BASH 中对变量的规定(与 C 语言的异同) BASH 中的基本流程控制语法 函数的使用 2.1     最简单的例子 -- Hello World! 几乎所有的讲解编程的书给读者的第一个例子都是 Hello World 程序,那么我们今天也就从这个例子出发,来逐步了解 BASH. 用 vi 编辑器编辑一个 hello 文件如下: #!/bin/bash# This is a very simple

bash shell编程快速入门教程

Shell 俗称壳(用来区别于核),是指"提供使用者使用界面"的命令解析器(软件).它类似于DOS下的command和后来的cmd.exe.它接收用户命令,然后调用相应的应用程序. 同时,Shell又是一种程序设计语言.作为命令语言,它交互式解释和执行用户输入的命令,或者自动地解释和执行预先设定好的一连串的命令.Shell不像C/C++等语言,它不需要编译就能执行.作为程序设计语言,Shell 定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支. UNIX系

零基础学习云计算及大数据DBA集群架构师【Linux Bash Shell编程及系统自动化2015年1月20日周三】

老师讲的所有实验记录 1.写一个脚本,判断用户是否存在,如果存在则删除.若不存在,就提示不存在. 2.三个数字比大小,输出最大的 3.三个数字比大小,并且按从大到小排列 4.画斜线正反 5.达到如下效果 * *** ***** ******* ********* 6.写一个9*9乘法表 7.画一个平行四边形 8.连乘算法 while和until 9.要求根据userlist创建用户,要求指定用户名,用户id,用户的附加组及变更用户u密码,若对应用户的附加组不存在,则将附加组创建出来后再根据要求添

bash/shell编程学习(3)

接上节继续, 1. 从键盘读取输入内容 #!/bin/bash read -p 'please input something:' input echo 'your input:' $input 运行效果: ./read1.sh please input something:123 your input: 123 2. while循环及case分支 #!/bin/bash printf '\nplease input a number or character, press "q" o