shell脚本常用命令

1.Shell中的特殊符号

(1)        $ 美元符号。用来表示变量的值。如变量NAME的值为Mike,则使用$NAME就可以得到“Mike”这个值。

(2)        # 井号。除了做为超级用户的提示符之外,还可以在脚本中做为注释的开头字母,每一行语句中,从#号开始的部分就不执行了。

(3)        “” 双引号。shell不会将一对双引号之间的文本中的大多数特殊字符进行解释,如#不再是注释的开头,它只表示一个井号“#”。但仍然保持特殊含义。(在双引号中的加变量名,即:$PARAM_NAME,依然会转换成变量的值。)

(4)        双引号对于某些特殊符号是不起作用的, 例如:”,$,,`(反引号)

(5)        双引号和单引号不能嵌套。即:echo ‘””’ 输出””, echo “’’” 输出’’

(6)        ‘’ 单引号。shell不会将一对单引号之间的任何字符做特殊解释。(在双引号中的加变量名,即:PARAM_NAME,不会转换成变量的值。)

(7)        echo “$HOME” (结果:/home/xiongguoan)

(8) `` 倒引号。命令替换。在倒引号内部的shell命令首先被执行,其结果输出代替用倒引号括起来的文本,不过特殊字符会被shell解释。

(9) echo ‘HOME(:HOME’ (结果:HOME)

(10)        \ 斜杠。用来去掉在shell解释中字符的特殊含义。在文本中,跟在\后面的一个字符不会被shell特殊解释,但其余的不受影响。

(11)        []中括号, 主要是用来测试条件的,通常放在if语句的后面。 (不过还是不太明白),但是中括号本身不会在测试语句执行后消失。

(12)        echo [$HOME] (结果:出现错误)

(13)        echo [$HOME ] (结果:[/home/xiongguoan ]) (注意:HOME后面有空格哦。)

(14)        echo [$HOME –eq ‘/xiong’] (结果:[/home/xiongguoan –eq /xiong])

(15)        {}大括号,主要是和$符号配合,作为字符串连接来使用

(16)        echo ${HOME}ismydir (结果:/home/xiongguoanismydir)

2. 预定义的变量

2.1 特殊变量
      $ shell变量名的开始,如$var

      | 管道,将标准输出转到下一个命令的标准输入

      $# 记录传递给Shell的自变量个数

 注释开始

      & 在后台执行一个进程

      ? 匹配一个字符

      * 匹配0到多个字符(与DOS不同,可在文件名中间使用,并且含.)

      $- 使用set及执行时传递给shell的标志位

      $! 最后一个子进程的进程号

      $? 取最近一次命令执行后的退出状态(返回码)

      $* 传递给shell script的参数

      [email protected] 所有参数,个别的用双引号括起来

      $0 当前shell的名字

      $n (n:1-) 位置参数

      $$ 进程标识号(Process Identifier Number, PID)

      > 输出重定向

<       输入重定向

       >> 输出重定向(追加方式)

      [] 列出字符变化范围,如[a-z]

2.2 代值变量

      * 任意字符串

      ? 一个任意字符

      [abc] a, b, c三者中之一

      [a-n] 从a到n的任一字符

2.3 特殊字符的表达
      \b 退回
      \c 打印一行时没有换行符 这个我们经常会用到
      \f 换页
      \r 回车
      \t 制表
      \v 垂直制表
      \ 反斜线本身

2.4 其他字符
2.4.1 分号

      ; 表示一行结束

2.4.2 圆括号

      () 表示在新的子shell中执行括号内的命令(这样可以不改变当前shell的状态。)但是圆括号在单/双引号内失去作用,只作为普通字符。

2.4.3 花括号

2.4.3.1
      分割命令的用法

      与圆括号相似,但是:1. 花括号内的命令在当前shell中执行;2.花括号必须作为命令的第一个字符出现。

2.4.3.2
       引用变量的用法

      在$后面,表示变量名的开始和结束

2.4.4
      方括号

      相当与test命令,用来执行测试条件,通常用在需要判断条件的语句后面,例如:if,while等等

3 .设置变量

3.1       格式:VARNAME=value (i.e. PARAM=’hello’)

3.2       注意:

3.2.1       等号的前后不能有空格

3.2.2       如果变量的值是一个命令的执行结果,请加上反引号(`)。

4 . 引用变量

4.1       $VARNAME

4.1.1       e.i. echo $HOME (结果:/home/xiongguoan)

4.2       变量默认值

4.2.1       在引用一个变量的时候可以设定默认值。如果在此之前,该变量已经设定了值,则此默认值无效。如果此时变量没有被设定值,则使用此默认值(但是没有改变此变量的值)。

4.2.2       echo Hello ${UNAME:-there} #其中there是UNAME的默认值

4.2.3        其他关于默认值与判读变量的方法:
shell脚本常用命令
4.2.4       注意:

4.2.4.1       使用${VALIABLE:?MESSAGE},如果发现此变量此时没有值,则脚本停止运行并显示行号和变量名称。 主要用于调试。

5.source / export / let / unset

5.1       source

5.1.1       正常情况下,脚本中执行的参数设置只能影响到shell脚本本身的执行环境,不能影响到调用此shell的脚本。

5.1.2       使用source命令执行脚本,可以让脚本影响到父shell的环境(即调用此shell的当前shell)。

5.1.3       例如:source env.sh

5.2       export

5.2.1       在bash下,使用export建立环境变量后,会影响到子shell脚本和当前shell的环境变量

5.3       unset

5.3.1       删除环境变量

5.3.2       i.e.

 #export newval=1

#echo $ewval

1

#unset newval

#echo $newval

(ß此处为空行,newval已经被删除)

5.4       let

5.4.1        在bash中只用此命令可以建立一个临时的变量,此变量不会影响到子shell

6.逻辑判断

6.1       if
6.1.1       单格式与嵌套

if 条件表达式
then #当条件为真时执行以下语句
命令列表
else #为假时执行以下语句
命令列表
fi
if 语句也可以嵌套使用

if 条件表达式1
then
if 条件表达式2
then
命令列表
else
if 条件表达式3
then
命令列表
else
命令列表
fi
fi
else
命令列表
fi

6.1.2 多分支格式

if test -f “$1”
then
lpr $1
elif test -d “$1” #elif 同else if
then
(cd $1;lpr $1)
else
echo “$1不是文件或目录”
fi

6.2 case
6.2.1 格式

case $newval in

  1.      #这里是可能值1
    

echo 1

;; #表示第一个分支结束

  1.       #这里是可能值 2
    

echo 2

;; #第二个分支结束

*) #表示其他可能值,必须在最后,否则他后面的语句无法执行

echo unkown

esac #case 语句结束

6.3 while /until
6.3.1 格式

while 表达式

do

命令列表

done

6.3.2 例如:

Sum=0
i=0
while true #true是系统的关键词 表示真
do
i=expr $i + 1
Sum=expr $Sum + $i
if [ $i = “100” ]
then
break;
fi
done
echo $i $Sum
最后这个程序显示的是 100 5050

下面将这个程序再改动一下

Sum=0
i=0
while [ $i != “100” ]
do
i=expr $i + 1
Sum=expr $Sum + $i
done
echo $i $Sum

改动后的程序运算结果和上面是一样 但程序比上面的要简练

在这个循环中还可以以until做为测试条件 它正好与while测试的条件相反,也就是当条件为假时将继续执行循环体内的语句,否则就退出循环体,下面还用这个例子.

Sum=0
i=0
until [ $i = “100” ]
do
i=expr $i + 1
Sum=expr $Sum + $i
done
echo $i $Sum
当i不等于100时循环 就是当条件为假时循环,否则就退出,而第一个例子是当i不等于100
时循环,也就是测试条件为真时循环.

6.4 for
6.4.1 枚举用法
6.4.1.1 格式

for 变量 in 名字列表
do
命令列表
done

8.4.1.2 格式

for n in {1…10}

do

echo $n

done

for letter in a b c d e;

do

echo $letter

done

6.4.2 文件用法
6.4.2.1 格式

for file in *

do

   echo $file

done

6.4.2.2 例子

for File in a1 a2 a3 a4 a5
do
diff aa/Filebb/File bb/File
done

6.4.3 累加格式

for (( i=1;$i<10;i++))

do

echo $i

done

for(( i=1;i&lt;10;i=i&lt;10;i=[$i+1’ ])

do

echo $i

done

6.5 其他循环控制语句
break 命令不执行当前循环体内break下面的语句从当前循环退出.
continue 命令是程序在本循体内忽略下面的语句,从循环头开始执行.

6.6 逻辑判断的表达

一、判断文件的属性

格式:-操作符 filename
-e 文件存在返回1, 否则返回0
-r 文件可读返回1,否则返回0
-w 文件可写返回1,否则返回0
-x 文件可执行返回1,否则返回0
-o 文件属于用户本人返回1, 否则返回0
-z 文件长度为0返回1, 否则返回0.
-f 文件为普通文件返回1, 否则返回0
-d 文件为目录文件时返回1, 否则返回0

二、测试字符串
字符串1 = 字符串2 当两个字串相等时为真
字符串1 != 字符串2 当两个字串不等时为真
-n 字符串      当字符串的长度大于0时为真
-z 字符串      当字符串的长度为0时为真
字符串       当串字符串为非空时为真

三、测试两个整数关系
数字1 -eq 数字2     两数相等为真
数字1 -ne 数字2     两数不等为真
数字1 -gt 数字2     数字1大于数字2为真
数字1 -ge 数字2     数字1大于等于数字2为真
数字1 -lt 数字2     数字1小于数字2为真
数字1 -le 数字2     数字1小于等于数字2为真

四、逻辑测试
-a         与
-o        或
!        非