2014-06-26 Created By BaoXinjian


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 "$n1=$n2"    #输出n2=abc

#以动态方式将动态变量n2的值赋给变量t

eval t=\$${n1}

echo "t=$t"   #输出t=abc


1、$0

当前执行的shell script文件名(带完整路径)

2、$1 ~ $n

依次存放shell script的命令行参数,数值大于9时必须要用{}括起来,比如${10}。

命令行参数可以通过shift命令进行位移操作,位置参数根据shift命令指定的数值往前移动,如不指定移动值,则移动1次。例如:

#!/bin/bash

echo "所有入参:$@"

while shift

do

[ -n "$1" ] && echo $1

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"  #输出 hello $test $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 (( $1 > $2 ));then

echo "$1 > $2"

elif (( $1 == $2 ));then

echo "$1 = $2"

else

echo "$1 < $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 "$i,$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

Thanks and Regards

参考: lykyl - http://www.cnblogs.com/lykyl/archive/2013/02/15/2912764.html

DBA_基本Bash语法汇总(汇总)的更多相关文章

  1. DBA_基本Bash语法汇总

    一.变量 1.变量命名可使用英文字母.数字和下划线,必须以英文字母开头,区分大小写. 2.每个shell都拥有自己的变量定义,彼此互不影响. 3.变量直接以等号赋值,注意等号两边不可留空,若等号右侧有 ...

  2. shell脚本语法基础汇总

    shell脚本语法基础汇总 将命令的输出读入一个变量中,可以将它放入双引号中,即可保留空格和换行符(\n) out=$(cat text.txt) 输出1 2 3 out="$(cat te ...

  3. bash语法注意点

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

  4. Shell 编程基础之基本语法结构汇总

    一.条件语句 简单条件 if [ condition ]; then # 当 condition 成立时,执行内容: fi # 将 if 反过来写,fi 结束 if 之意 复杂条件 if [ cond ...

  5. ES6 常用语法知识汇总

    ES6模块化如何使用,开发环境如何打包? 1.模块化的基本语法 /* export 语法 */ // 默认导出 export default { a: '我是默认导出的', } // 单独导出 exp ...

  6. php基础语法学习汇总

    常量学习: <?php # function demo function sum($x,$y){ $z=$x+$y; return $z; } echo sum(1,2); #define de ...

  7. oracle语法练习汇总

    全是自己一个一个敲出来的啊 啊 啊 --(1)查询20号部门的所有员工信息. --(2)查询所有工种为CLERK的员工的工号.员工名和部门名. select e.empno,e.ename,d.dna ...

  8. python3基础01(常见语法基础汇总)

    #!/usr/bin/env python# -*- coding:utf-8 -*- # 换行\n 续行\ s[:i] + s[i:] 等于 s#转义 \e 空 \000 八进制 \oyy 十六进制 ...

  9. C/C++语法知识点汇总

    *  静态局部变量,在不同函数中可以同名. 静态全局变量,在不同文件中可以同名. 静态函数,在不同文件中可以同名. *  普通全局变量和普通函数,在同一工程中不能同名. 在相链接的程序与库之间,可以同 ...

随机推荐

  1. JavaWeb学习记录(十九)——jstl自定义标签库之传统标签

    一.传统标签 (1)JSP引擎将遇到自定义标签时,首先创建标签处理器类的实例对象,然后按照JSP规范定义的通信规则依次调用它的方法. public void setPageContext(PageCo ...

  2. android中的DatePicker与TimePicker

    1.布局文件 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns ...

  3. 为什么说Parcelable 比Serializable更高效

    本文转载自:http://blog.csdn.net/androidzhaoxiaogang/article/details/8172539 什么是序列化,实现序列化的目的是什么? 讨论这个问题之前, ...

  4. 论文笔记之:Spatially Supervised Recurrent Convolutional Neural Networks for Visual Object Tracking

    Spatially Supervised Recurrent Convolutional Neural Networks for Visual Object Tracking  arXiv Paper ...

  5. linux 大并发下 内核优化

     To support over 500k users, you *need* - A 64 bits hardware/kernel (AMD64, Opterons) - At least 8GB ...

  6. Java static block static constructor , static field

    http://stackoverflow.com/questions/7121213/singleton-instantiation http://docs.oracle.com/javase/spe ...

  7. mvn使用问题

    http://mirrors.ibiblio.org/maven2/org/apache/maven/archetypes/ http://blog.csdn.net/u011340807/artic ...

  8. SQL 将一列多行数据合并为一行 FOR XML PATH

    FOR XML PATH 方法是用于将查询结果集以XML形式展示,这样展示方式的好处不言而喻.现在我要介绍的FOR XML PATH的"另类"用法. 首先,我们先来看看它的正常用法 ...

  9. 021. asp.net两个DataSet数据集的合并

    protected void Page_Load(object sender, EventArgs e) { DataSet dsSource = new DataSet(); //创建源数据集 Da ...

  10. 在Windows 10上安装Oracle 11g数据库出现的问题及解决

    在Windows 10上安装Oracle 11g数据库,并且很多次出现过:当安装的进度条进行到快要结束的时候弹出一个提示框.如下: [Java(TM)2 Platform Standard Editi ...