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

 2014-06-26 Created By
BaoXinjian

图片 1一、变量


一 、变量命名可应用英文字母、数字和下划线,必须以英文字母开始,区分轻重缓急写。

二 、各个shell都有所自个儿的变量定义,相互互不影响。

③ 、变量间接以等号赋值,注意等号两边不足留空,若等号左侧有空格,赋值要用引号括起来。

例如:

test=1

test=’hello world’

4、通过在变量名前加$的法门取得变量的值。也许使用${变量名}的格局,以利于变量名和紧接其后的字母或下划线举行区分。

例如:${test}

5、通过${#变量}的款型得到变量值字串的尺寸。

例如:test=’12345′;echo ${#test}  
#输出5

陆 、能够将变量证明为全局变量,全局变量功能范围涵盖所有shell。命令为:export
变量名

例如:export test

⑦ 、使用unset注销变量,须要留意的是撤销仅局限于近来shell,尽管全局变量也一律。unset
-v 变量名

例如:unset test

⑧ 、清空变量的形式:变量名=

例如:test=

⑨ 、数组变量

应用变量名=(成员值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]}

十 、使用readonly能够声宾博(Karicare)个变量为只读属性。

例如:

readonly test 
#宣示test变量为只读

readonly -f testfunc 
#扬言testfunc函数为只读

readonly -a testarray 
#声称testarray数组为只读

1① 、bash
shell能够经过declare实行变量注明。

例如:

declare -a testarray 
#概念三个数组变量

declare -i test   
#概念3个整型变量

declare -r test   
#概念2个只读变量

declare -t test   
#设定变量具有trace属性

declare -x test   
#概念2个环境变量

1② 、shell提供一组命令检查和测试变量是不是留存或是还是不是为空,依据检测结果进行相应操作,列表如下:

${变量:-字串} 
即使变量存在且有值,重回变量值,不然再次回到字串内容。

${变量:=字串} 
假使变量存在且有值,重回变量值,不然将字串赋给变量,并赶回字串内容。

${变量:?字串} 
假如变量存在且有值,重临变量值,否则展现将字串作为错误新闻突显,并脱离script执行。

${变量:+字串} 
如若变量存在且有值,再次来到字串内容,不然再次来到空值。

注:去掉命令中的:,则只检测变量是还是不是留存,不检查和测试是或不是为空。

1③ 、变量能够由此${变量:起头地点:截取长度}的方式,过行取子串操作。假诺从初阶地点取至字串尾,则截取长度能够大约。

例如:

test=”123456789″

echo ${test:1:3}    #输出234

echo ${test:2}    #输出3456789

1肆 、变量能够经过命令对其字串值进那行删除替换处理,列表如下:

${变量#匹配式}  
依照匹配式从左最短匹配子串并剔除。

${变量##匹配式}  
依照匹配式从左贪婪匹配子串并剔除。

${变量%匹配式}  
依照匹配式从右最短匹配子串并删除。

${变量%%匹配式}  
依据匹配式从右贪婪匹配子串并剔除。

${变量/匹配式/替换串}  
遵照匹配式从左匹配第二个头串替换到替换串。

${变量//匹配式/替换串}  
根据匹配式匹配全数子串替换来替换串。

${变量/#匹配式/替换串}  
根据匹配式从左匹配第1身长串替换到替换串。

${变量/匹配式/}  
依照匹配式从左匹配第壹身材串并删除。

${变量//匹配式/}  
依照匹配式从右匹配全数子串并剔除。

${变量/#匹配式/}  
依据匹配式从左匹配第一个子串并删除。

${变量/%匹配式/}  
依据匹配式从右匹配全体子串并剔除。

1五 、利用eval达成动态变量功效,动态变量的变量名由另1个变量的值构成。

示例:

#设n1变量的值为另三个变量的称号

n1=”n2″

#给动态变量n2赋值

eval ${n1}=abc

echo “$n1=$n2”    #输出n2=abc

#以动态格局将动态变量n2的值赋给变量t

eval t=\$${n1}

echo “t=$t”   #输出t=abc

 

图片 2二 、常用系统变量


1、$0

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

2、$1 ~ $n

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

命令行参数能够经过shift命令进行运动操作,地方参数依据shift命令钦命的数值往前移动,如不钦点移动值,则运动一次。例如:

#!/bin/bash

echo “全数入参:$@”

while shift

do

  [ -n “$1” ] && echo $1

done

3、$*

将装有命令行参数做为二个字符串存入此变量。

4、$@

将全数命令行参数做为3个字符串数组,各样参数为一个分子变量,存入此变量。

5、$#

命令行参数的个数。

6、$?

上一条命令执行后的重回码。

7、$$

现阶段施行的shell script进度编号。

8、$!

上三个后台程序的进度编号。

9、$_

script执行时,存放bash的相对路径。

bash交互时,存放上二个下令最终三个命令行参数。

邮件检查和测试时,存放邮件文件名。

 

图片 3三 、常用内置命令


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

 

**图片 4四、函数**


一 、基本格式

function 函数名()

{

  命令

  … …

}

贰 、基本用法

主要词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`

 

图片 5⑤ 、流程序控制制命令


一 、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

② 、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个或二个括号里的匹配串。

*(匹配串)
匹配0个以上括号里的匹配串。

+(匹配串) 匹配1个括号里的匹配串。

@(匹配串)
匹配括号里的卓殊串在那之中的一项。

!(匹配串) 匹配非括号里的匹配串。

叁 、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

肆 、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

五 、until循环命令

主干格式:

until 条件判断

do

  命令

  …

done

当条件不符合条件判断式时实施循环体。

六 、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

柒 、break命令,中止并跳出当前循环体。

⑧ 、continue命令,直接甘休此轮循环,继续下轮循环。

九 、条件判断命令

规范判断命令是与流程序控制制语句合作使用的通令。

指令格式: 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

图片 6