DBA_基本Bash语法汇总
一、变量
1、变量命名可使用英文字母、数字和下划线,必须以英文字母开头,区分大小写。
2、每个shell都拥有自己的变量定义,彼此互不影响。
3、变量直接以等号赋值,注意等号两边不可留空,若等号右侧有空格,赋值要用引号括起来。
例如:
test=1
test='hello world'
4、通过在变量名前加{变量名}的形式,以利于变量名和紧接其后的字母或下划线进行区分。
例如:${test}
5、通过${#变量}的形式获取变量值字串的长度。
例如:test='12345';echo ${#test} #输出5
6、可以将变量声明为全局变量,全局变量作用范围包含所有shell。命令为:export 变量名
例如:export test
7、使用unset注销变量,需要注意的是注销仅局限于当前shell,即使全局变量也一样。unset -v 变量名
例如:unset test
8、清空变量的方式:变量名=
例如:test=
9、数组变量
使用变量名=(成员值1 成员值2 ...)的形式赋值,成员值之间以空格分隔。
例如:$testarray=(1 2 'abcd' 38)
数组值获取使用$变量名[下标]的形式,下标从0计数。
例如:$testarray[2]
通过{变量名[*]}可以获取数组所有成员,区别是,前者是各成员单独输出,后者是将所有成员以一个字符串的形式整体输出。
通过{#变量名[@]}或{#变量名[*]}可以获取数组成员数量。例如:${#testarray[@]}。
需要注意unset某个数组成员后,此成员的下标并不移除。
例如:
testarray=(1 2 3 4 5 6)
unset testarray[2]
echo testarray[2] #无值输出
echo testarray[3] #输出4
数组可以动态添加成员,例如:testarray=($testarray[@] 7);
如果数组下标也是变量,则应用{}将数组变量括起来,例如:i=1;echo {testarray[i]}
10、使用readonly可以声明一个变量为只读属性。
例如:
readonly test #声明test变量为只读
readonly -f testfunc #声明testfunc函数为只读
readonly -a testarray #声明testarray数组为只读
11、bash shell可以通过declare进行变量声明。
例如:
declare -a testarray #定义一个数组变量
declare -i test #定义一个整型变量
declare -r test #定义一个只读变量
declare -t test #设定变量具有trace属性
declare -x test #定义一个环境变量
12、shell提供一组命令检测变量是否存在或是否为空,根据检测结果执行对应操作,列表如下:
${变量:-字串} 如果变量存在且有值,返回变量值,否则返回字串内容。
${变量:=字串} 如果变量存在且有值,返回变量值,否则将字串赋给变量,并返回字串内容。
${变量:?字串} 如果变量存在且有值,返回变量值,否则显示将字串作为错误信息显示,并退出script执行。
${变量:+字串} 如果变量存在且有值,返回字串内容,否则返回空值。
注:去掉命令中的:,则只检测变量是否存在,不检测是否为空。
13、变量可以通过${变量:起始位置:截取长度}的形式,过行取子串操作。如果从起始位置取至字串尾,则截取长度可以省略。
例如:
test="123456789"
echo ${test:1:3} #输出234
echo ${test:2} #输出3456789
14、变量可以通过命令对其字串值进这行删除替换处理,列表如下:
${变量#匹配式} 根据匹配式从左最短匹配子串并删除。
${变量##匹配式} 根据匹配式从左贪婪匹配子串并删除。
${变量%匹配式} 根据匹配式从右最短匹配子串并删除。
${变量%%匹配式} 根据匹配式从右贪婪匹配子串并删除。
${变量/匹配式/替换串} 根据匹配式从左匹配第一个子串替换成替换串。
${变量//匹配式/替换串} 根据匹配式匹配所有子串替换成替换串。
${变量/#匹配式/替换串} 根据匹配式从左匹配第一个子串替换成替换串。
${变量/匹配式/} 根据匹配式从左匹配第一个子串并删除。
${变量//匹配式/} 根据匹配式从右匹配所有子串并删除。
${变量/#匹配式/} 根据匹配式从左匹配第一个子串并删除。
${变量/%匹配式/} 根据匹配式从右匹配所有子串并删除。
15、利用eval实现动态变量功能,动态变量的变量名由另一个变量的值构成。
示例:
#设n1变量的值为另一个变量的名称
n1="n2"
#给动态变量n2赋值
eval ${n1}=abc
echo "n2"
#输出n2=abc
#以动态方式将动态变量n2的值赋给变量t
eval t=\$${n1}
echo "t=$t" #输出t=abc
二、 常用系统变量
1、$0
当前执行的shell script文件名(带完整路径)
2、n
依次存放shell script的命令行参数,数值大于9时必须要用{}括起来,比如${10}。
命令行参数可以通过shift命令进行位移操作,位置参数根据shift命令指定的数值往前移动,如不指定移动值,则移动1次。例如:
#!/bin/bash
echo "所有入参:$@"
while shift
do
[ -n "1" ] && echo1
done
3、$*
将所有命令行参数做为一个字符串存入此变量。
4、$@
将所有命令行参数做为一个字符串数组,每个参数为一个成员变量,存入此变量。
5、$#
命令行参数的个数。
6、$?
上一条命令执行后的返回码。
7、$$
当前执行的shell script进程编号。
8、$!
上一个后台程序的进程编号。
9、$_
script执行时,存放bash的绝对路径。
bash交互时,存放上一个命令最后一个命令行参数。
邮件检测时,存放邮件文件名。
三、常用内置命令
1、echo
显示信息,自动换行
echo -n
取消自动换行
echo -e
字串中控制符生效,比如\n
echo显示的信息如果包含空格则应用单引号或双引号括起来。
用双引号括起来的内容,会对其中的变量取值、运算式计算结果、获取命令执行结果、转义符进行转义后再输出。
单引号对括起来内容不做任何转换直接输出。
例如:echo "it's me" #输出 it's me
test=lykyl;echo 'test' #输出test
如果显示信息包括变量则获取变量值后再与字串组合后显示。
例如:test=lykyl;echo "hello $test" #输出 hello lykyl
如果确实要输出$字符,可以通过转义符或将字串用单引号括起来。
例如:test=lykyl;echo -n 'hello test';echo "\$test" #输出 hellotest
$test
2、:
回传0
3、eval
解析字串参数,以命令形式执行
4、source
在当前shell中执行指定shell程序。
例如:source func.sh
6、read
read 变量名
获取用户输入,并将输入内容存入命令后面的变量中。如果不指定变量,则默认存入REPLY这个变量中。
read -p '提示信息' 变量名
显示提示信息后,等待用户输入。
read -a 变量名
接受以空格分隔的一组值,存入指定的变量中。
read -r 变量名
read命令默认去掉转义字符前面的反斜杠,例如,输入\n存入变量后只有n。增加-r选项后,read命令将接受转义字符,不做过滤。
read -t 等待时长 变量名
设置read等待输入的时长,超时后read将返回一个非零值。
read -s 变量名
隐藏用户输入内容在屏幕上的回显。
7、exec
exec 命令
执行命令,取代目前shell。
exec < 文件名
转向输入,将通过标准输入读取数据的方式变成从指定文件获取。
8、eval
执行命令后面参数组合成的指令。
例如:
showfile='/etc/passwd'
eval "cat $showfile"
9、expr
返回算术运算式的值,需要注意运算式元素间应以空格分隔,遇到与系统控制符冲突的操作符要加转义。
例如:
expr 1 + 1
expr 2 \* 3
四、函数
1、基本格式
function 函数名()
{
命令
... ...
}
2、基本用法
关键词function和函数名后的括号可以单独省略,但不可同时省略。
默认以最后执行命令的返回值代表函数的返回码。可以使用return命令立即结束函数执行,并以return后指定的值做为返回码。如果return未指定值,则返回0。
函数需要在首次调用前定义,建议在程序最前面定义。
可以将函数统一定义在单独文件中,再以source或. (注意.后面有空格)的形式被其他程序调用。为了不产生冲突,建议函数包中定义的函数名以下划线开头。
函数内局部变量应以local关键词定义。
函数直接以函数名调用,如需传入参数则在函数名加空格后跟写,多个参数以空格分隔。
函数使用和$n的形式调用传入的位置参数,此时主程序的位置参数不受影响。
函数定义后支持动态调用。
例如:
func.sh
#!/bin/bash
_testfunc()
{
if (( 2
));then
echo "2"
elif (( 2
));then
echo "2"
else
echo "2"
fi
return 10
}
main.sh
#!/bin/bash
. func.sh
_testfunc 32 24
_testfunc 15 15
_testfunc 1 12
#动态调用示例
s="_testfunc"
`$s 12 12`
五、流程控制命令
1、if 条件转向命令
1.1 基本格式:
if 命令A
then
命令
...
else
命令
...
fi
1.2 嵌套格式:
if 命令A
then
命令
...
elif 命令B
then
命令
...
elif 命令C
then
命令
...
...
...
fi
如果if后面跟的命令执行返回码为0则执行then后面的命令,否则执行else后面的命令。
if和then可以放到一行,前提是if后跟的命令加分号结尾。
例如:
if test -r /etc/passwd; then cat /etc/passwd; fi
2、case条件选择命令
基本格式:
case 变量 in
匹配串1)
命令
...
;;
匹配串2)
命令
...
;;
... ...
... ...
匹配串n)
命令
...
;;
*)
命令
...
;;
esac
匹配串的格式:
单纯字符串 完全匹配。
* 任意长度的任意字串,包括空串。例如:j*k,匹配jack、jak。
? 单个字符。例如:j??k,匹配jack,但不匹配jak。
[] 字符集.例如:[a-c]OK,匹配aOK、bOK、cOK。
| 匹配多个匹配串。例如:j??k|[a-c]OK|jak。
如果打开extglob选项,则能支持高级匹配。shopt -s extglob
?(匹配串) 匹配0个或1个括号里的匹配串。
*(匹配串) 匹配0个以上括号里的匹配串。
+(匹配串) 匹配1个括号里的匹配串。
@(匹配串) 匹配括号里的匹配串其中的一项。
!(匹配串) 匹配非括号里的匹配串。
3、for循环命令
3.1 基本格式1:
for 变量 in IFS分隔符定义的字串
do
命令
...
done
3.2 处理基本字串:
for i in 1 2 3 4 5 6 7 8 9
do
echo $i
done
3.3 从文件取串处理:
for i in $(cat /etc/passwd)
do
IFS_old=IFS
IFS=':'
for j in $i
do
echo "$j "
done
echo "---------------------------"
IFS=IFS_old
done
3.4 以通配符遍历目录:
for i in /etc/*
do
if [ -f "$i" ]; then
echo "$i 是文件"
fi
done
3.5 基本格式2:
for ((初始化;结束条件判断;参数变更))
do
命令
...
done
此格式类似C语言,具体定义不再阐述。仅举一例
for ((i=1,j=1;(i+j)<=100;i=i+1;j=j+1))
do
echo "j"
done
4、while循环命令
4.1 基本格式:
while 条件判断
do
命令
...
done
当条件符合条件判断式时执行循环体。
4.2 基本应用:
i=0
while (($i<10))
do
echo $i
i=i+1))
done
4.3 从文件读取内容:
while read line
do
echo $line
done < "/etc/passwd"
4.4 无限循环:
while :
do
sleep 5
done
5、until循环命令
基本格式:
until 条件判断
do
命令
...
done
当条件不符合条件判断式时执行循环体。
6、select菜单选择命令
基本格式:
select 变量 in IFS定义的分隔符分隔的字串行
do
命令
... ...
done
将字串以IFS定义的分隔符为界分解成若干项,编号后列表显示输出,并将环境变量PS3定义的内容作为选择提示符显示。根据用户选择进行相应的操作。
例如:
PS3="请您选择:"
select sel in "测试 1" "测试选择2" "测试选择 3" "退出选择"
do
case $sel in
"测试 1")
echo "测试 1";;
"测试选择2")
echo "测试 2";;
"测试选择 3")
echo "测试 3";;
*)
break
;;
esac
done
7、break命令,中止并跳出当前循环体。
8、continue命令,直接结束此轮循环,继续下轮循环。
9、条件判断命令
条件判断命令是与流程控制语句配合使用的命令。
命令格式: test 条件判断式
返回条件判断式的值,条件成立返回0,否则返回非0值。
通常使用[ 条件判断式 ]的格式代替test命令,注意条件判断式与[]必须有空格分开。
参与判断的变量必须已初始化且非空。
例如:[ -e ~/.bashrc ]
9.1 条件判断支持复合条件判断:
A、与判断
使用&&分隔两条判断命令。
例如:[ -e ~/.bashrc ] && [ ~/.bashrc -nt /etc/passwd ]
B、或判断
使用||分隔两条判断命令。
例如:[ -e ~/.bashrc ] || [ ~/.bashrc -nt /etc/passwd ]
C、非判断
使用!符号进行非判断。
例如: ![ -e ~/.bashrc ]
9.2 条件判断式包括数值判断、字串判断、文件判断和复合判断四类操作,分别定义如下:
A、数值判断
[ n1 -eq n2 ] #判断n1==n2
[ n1 -ge n2 ] #判断n1>=n2
[ n1 -gt n2 ] #判断n1>n2
[ n1 -le n2 ] #判断n1<=n2
[ n1 -lt n2 ] #判断n1<n2
[ n1 -ne n2 ] #判断n1!=n2
注意:数值判断仅支持整型。
B、字串判断
[ str1 = str2 ]
[ str1 != str2 ]
[ str1 < str2 ]
[ str1 > str2 ]
[ -n str1 ] #判断str1长度是否非0
[ -z str1 ] #判断str1长度是否为0
注:如果字串有空格,应将其用引号括起来。
C、文件判断
[ -d file ] #判断目录file是否存在
[ -e file ] #判断file是否存在
[ -f file ] #判断文件file是否存在
[ -r file ] #判断file是否存在并可读
[ -s file ] #判断file是否存在并非空
[ -w file ] #判断file是否存在并可写
[ -x file ] #判断file是否存在并可执行
[ -O file ] #判断file是否存在并属于当前用户
[ -G file ] #判断file是否存在且默认组于当前用户所属组是否相同
[ file1 -nt file2 ] #判断file1是否比file2新
[ file1 -ot file2 ] #判断file1是否比file2旧
D、复合判断
-a 与操作,例如:[ -e file -a -r file ]
-o 或操作,例如:[ -e file -o -r file ]
条件判断可以通过(())使用标准数学运算符进行数值赋值运算和判断。
例如:
test=3
if (( $test * 3 > 1 ));then
echo $test
else
echo $(( ++test ))
fi
条件判断可以通过[[]]代替test进行字串比较,同时还提供了正则匹配功能。注意判断式和[[、]]以及运算符之间要用空格分隔。
例如:
test="aaabbb123"
if [[ $test == 'a*' ]];then
echo ok
fi
参考: lykyl - http://www.cnblogs.com/lykyl/archive/2013/02/15/2912764.html
DBA_基本Bash语法汇总的更多相关文章
- DBA_基本Bash语法汇总(汇总)
2014-06-26 Created By BaoXinjian
- Go语言语法汇总(转)
Go语言语法汇总 分类: 技术2013-09-16 14:21 3007人阅读 评论(0) 收藏 举报 go语言golang并发语法 目录(?)[+] 最近看了看GoLang,把Go语言的语法 ...
- bash语法注意点
bash 语法注意点 =和不能分开 如: val=expr $a + $b` [空格 *** 空格]条件判断要有空格 如: if [ $a ==$b ] 表达式和运算符之间要有空格, $a空格 + 空 ...
- mysql基础知识语法汇总整理(二)
mysql基础知识语法汇总整理(一) insert /*insert*/ insert into 表名(字段列表) values(值列表); --蠕虫复制 (优点:快速复制数据,测试服务器压力) in ...
- mysql基础知识语法汇总整理(一)
mysql基础知识语法汇总整理(二) 连接数据库操作 /*连接mysql*/ mysql -h 地址 -P 端口 -u 用户名 -p 密码 例如: mysql -u root -p **** /* ...
- ORACLE| ORACLE基础语法汇总
创 ORACLE| ORACLE基础语法汇总 2018-07-18 16:47:34 YvesHe 阅读数 9141更多 分类专栏: [数据库] 版权声明:本文为博主原创文章,遵循CC 4.0 B ...
- [转]shell awk sed tr grep 语法汇总
tr 基本语法 -c # 用字符串1中字符集的补集替换此字符集,要求字符集为ASCII -d # 删除字符串1中所有输入字符 -s # 删除所 ...
- SQL SERVER数据库基本语法汇总,仅代表个人整理,仅供参考
以下SQL基本语法皆由本人整理,以下做一个汇总,关于游标,可作为了解,不要求掌握,其他查询.修改.删除操作等基本语法必须会使用.select * from [dbo].[TBICJE]select m ...
- Linux Shell脚本简单语法汇总(Deepin下运行)
整理自: https://www.runoob.com/?s=shell Shell 脚本(shell script),是一种为 shell 编写的脚本程序. 业界所说的 shell 通常都是指 sh ...
随机推荐
- JAVAEE——BOS物流项目11:在realm中授权、shiro的方法注解权限控制、shiro的标签权限控制、总结shiro的权限控制方式、权限管理
1 学习计划 1.在realm中进行授权 2.使用shiro的方法注解方式权限控制 n 在spring文件中配置开启shiro注解支持 n 在Action方法上使用注解 3.★使用shiro的标签进行 ...
- C实战:强大的程序调试工具GDB
C实战:强大的程序调试工具GDB 1.基本调试 这里只列举最最常用的GDB命令. 1.1 启动GDB gdb program:准备调试程序.也可以直接进入gdb,再通过file命令加载. 1.2 添加 ...
- Python 妙用heapq
小顶堆求TopK大 大顶堆求BtmK小 题外话 Python有一个内置的模块,heapq标准的封装了最小堆的算法实现.下面看两个不错的应用. 小顶堆(求TopK大) 话说需求是这样的: 定长的序列,求 ...
- ActiveMQ + NodeJS + Stomp 极简入门
前提 安装ActiveMQ和Nodejs 测试步骤 1.执行bin\win32\activemq.bat启动MQ服务 2. 打开http://localhost:8161/admin/topics.j ...
- Apache shiro集群实现 (四)shiro授权(Authentication)--访问控制
Apache shiro集群实现 (一) shiro入门介绍 Apache shiro集群实现 (二) shiro 的INI配置 Apache shiro集群实现 (三)shiro身份认证(Shiro ...
- 【我的书】Unity Shader的书 — 目录(2016.5.19最后一次更新)
写在前面 感谢所有点进来看的朋友.没错,我目前打算写一本关于Unity Shader的书. 出书的目的有下面几个: 总结我接触Unity Shader以来的历程,给其他人一个借鉴.我非常明白学Shad ...
- linux中exec和xargs命令的区别和优劣分析
find的exec及ok命令 exec命令的格式为: exec command {} \; exec后面跟着的是操作命令,然后跟着{}表示每一个参数,然后空格,然后"\;".{}之 ...
- Eclipse打jar包,资源文件的读取
最近的工作中需要将java程序打一个jar包,然后在Linux中供调用.程序中需要读取一个配置文件.遇到了三个问题.第一个是依赖的第三方Jar包打成Jar包后找不到:第二个问题是资源文件所在的文件夹打 ...
- Dynamics CRM2013 用户进入系统所必需的那些权限
本篇以CRM2013为例,在CRM中新建一个安全角色后该安全角色基本是空的,如果新建的安全角色作为一个账号的唯一安全角色时,那这个安全角色除了需要配置业务场景所需的权限外,是要优先具备进入CRM系统的 ...
- Hadoop:Hadoop单机伪分布式的安装和配置
http://blog.csdn.net/pipisorry/article/details/51623195 因为lz的linux系统已经安装好了很多开发环境,可能下面的步骤有遗漏. 之前是在doc ...