一、变量


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语法汇总的更多相关文章

  1. DBA_基本Bash语法汇总(汇总)

     2014-06-26 Created By BaoXinjian

  2. Go语言语法汇总(转)

    Go语言语法汇总 分类: 技术2013-09-16 14:21 3007人阅读 评论(0) 收藏 举报 go语言golang并发语法   目录(?)[+]   最近看了看GoLang,把Go语言的语法 ...

  3. bash语法注意点

    bash 语法注意点 =和不能分开 如: val=expr $a + $b` [空格 *** 空格]条件判断要有空格 如: if [ $a ==$b ] 表达式和运算符之间要有空格, $a空格 + 空 ...

  4. mysql基础知识语法汇总整理(二)

    mysql基础知识语法汇总整理(一) insert /*insert*/ insert into 表名(字段列表) values(值列表); --蠕虫复制 (优点:快速复制数据,测试服务器压力) in ...

  5. mysql基础知识语法汇总整理(一)

    mysql基础知识语法汇总整理(二)   连接数据库操作 /*连接mysql*/ mysql -h 地址 -P 端口 -u 用户名 -p 密码 例如: mysql -u root -p **** /* ...

  6. ORACLE| ORACLE基础语法汇总

    创 ORACLE| ORACLE基础语法汇总 2018-07-18 16:47:34 YvesHe 阅读数 9141更多 分类专栏: [数据库]   版权声明:本文为博主原创文章,遵循CC 4.0 B ...

  7. [转]shell awk sed tr grep 语法汇总

    tr 基本语法 -c          # 用字符串1中字符集的补集替换此字符集,要求字符集为ASCII  -d          # 删除字符串1中所有输入字符  -s          # 删除所 ...

  8. SQL SERVER数据库基本语法汇总,仅代表个人整理,仅供参考

    以下SQL基本语法皆由本人整理,以下做一个汇总,关于游标,可作为了解,不要求掌握,其他查询.修改.删除操作等基本语法必须会使用.select * from [dbo].[TBICJE]select m ...

  9. Linux Shell脚本简单语法汇总(Deepin下运行)

    整理自: https://www.runoob.com/?s=shell Shell 脚本(shell script),是一种为 shell 编写的脚本程序. 业界所说的 shell 通常都是指 sh ...

随机推荐

  1. 20160208.CCPP体系详解(0018天)

    程序片段(01):main.c 内容概要:PointWithOutInit #include <stdio.h> #include <stdlib.h> //01.野指针详解: ...

  2. Dynamics CRM REST Builder

    今天介绍个很棒的工具叫CRM REST Builder,不管是2016之前的odata查询或者现在的web api都不在话下,界面如下,选项非常丰富 这里以retrieve multiple举个例子, ...

  3. Android开发之手把手教你写ButterKnife框架(三)

    欢迎转载,转载请标明出处: http://blog.csdn.net/johnny901114/article/details/52672188 本文出自:[余志强的博客] 一.概述 上一篇博客讲了, ...

  4. Android布局概述

    布局 布局定义用户界面的视觉结构,如Activity或应用小部件的 UI.您可以通过两种方式声明布局: 在 XML 中声明 UI 元素.Android 提供了对应于 View 类及其子类的简明 XML ...

  5. Python+Tkinter 密保小工具

    上图 代码 核心 编解码方面 Tkinter界面更新 总结 昨天被一同学告知,网上的一个QQ密码库中有我的一条记录,当时我就震惊了,赶紧换了密码.当然了,这件事也给了我一个警示,那就是定期的更换自己的 ...

  6. Java并发框架——AQS中断的支持

    线程的定义给我们提供了并发执行多个任务的方式,大多数情况下我们会让每个任务都自行执行结束,这样能保证事务的一致性,但是有时我们希望在任务执行中取消任务,使线程停止.在java中要让线程安全.快速.可靠 ...

  7. System startup files

    System startup files When you log in, the shell defines your user environment after reading the init ...

  8. Ubuntu下配置Telnet服务器

    1. 首先介绍linux中的守护进程 在Linux系统中有一个特殊的守护进程inetd(InterNET services Daemon),它用于Internet标准服务,通常在系统启动时启动.通过命 ...

  9. Spark技术内幕:究竟什么是RDD

    RDD是Spark最基本,也是最根本的数据抽象.http://www.cs.berkeley.edu/~matei/papers/2012/nsdi_spark.pdf 是关于RDD的论文.如果觉得英 ...

  10. Android必知必会-获取视频文件的截图、缩略图

    背景 公司最近要求给我负责的APP加上视频录制和发布的功能,我简单的完成了基本的录制和视频压缩功能,后来发现发布接口需要上传视频的截图,网上搜索了一下资料,在这里整理一下. 代码实现 /** * 获取 ...