bash shell编程
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
……
}
函数的参数传递
以上是关于bash shell编程的主要内容,如果未能解决你的问题,请参考以下文章
Shell编程Shell中Bash变量-数值运算运算符变量测试和内容替换
Shell编程Shell中Bash变量-数值运算运算符变量测试和内容替换
linux shell编程bash编程shell教程bash教程shell文档bash文档shell脚本bash脚本教程第一部分:绪论