您的位置:首页 > 运维架构 > Shell

shell脚本基础(备忘)

2013-03-18 21:00 357 查看

1、条件测试

两种格式:  test condition  或  [ condition ](注意两边加了空格)

condition可以是多个子条件的逻辑运算,逻辑运算符号有以下几种:

-a         逻辑与

-o        逻辑或

!          逻辑否

&&, ||

【实例】

$ ls aaa  &&  echo "yes"  ||  echo "no"

有文件aaa时会输出yes,否则输出no

2、文件测试

文件测试利用条件测试的方式测试一个文件或者目录的状态,如是否存在、是否可读等,具体的测试参数如下:

-d         目录

-f         普通文件(Regular file)

-L         符号链接

-r         Readable(文件、目录可读)

-b         块专用文件

-e         文件存在

-g         如果文件的set-group-id位被设置则结果为真

-s         文件长度大于0,非空

-z         文件长度=0

-w        Writable(文件、目录可写)

-u         文件有suid位设置

-x         Executable(文件可执行、目录可浏览)

-c         字符专用文件

-L         符号链接

例如测试文件file.txt是否存在,可以这样测试:

$test -e file.txt 或者 [ -e file.txt ]

3、字符串测试

字符串测试可以测试字符串是否为空,测试两个字符串是否相等等,具体的测试参数如下:

=         两字符串相等

!=        两字符串不等

-z         空串 [zero]

-n         非空串 [nozero]

4、数值测试

数值测试用于测试两个参数的大小、相等等情况,格式是:“number” numberic_operator “number” 或  [ “number” numberic_operator “number”],numberic_operator取值如下:

-eq       数值相等(equal)

-ne       不等(not equal)

-gt        A>B(greater than)

-lt         A<B(less than)

-le        A<=B(less、equal)

-ge       A>=B(greater、equal)

(疑问:好像不能用一个变量跟一个数值常量比较,要将值赋给变量然后比较两个变量,待考证!)

5、if结构

if 条件1

then 
      命令1

elif  条件2

then 
      命令2

else 
      命令3

fi

6、case结构

case variable in

       pattern [| pattern] …..) #匹配模式之间用"|"隔开

             命令….

             ;;

       模式2)

             命令…..

             ;;

       *) #匹配所有

             …….

             ;;

esac

7、for结构

for 变量名 in 列表

do

      命令1

      命令2

done

例子:

用于数值序列:

for loop in 1 2 3 4 5

for i in {1..10}

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

用于字符串序列:

for loop in “orange red blue grey”

用于命令的执行结果:

for loop in `ls`

无限循环:

for files in *

8、until结构

until  condition

do
      命令…..

done

9、while结构

while condition

do
      命令1
      命令2

done

10、bash 的组数(array)

一般而言,A="a b c def" 这样的变量只是将 $A 替换为一个单一的符串,

但是改为 A=(a b c def) ,则是将 $A 定义为组数...

bash 的组数替换方法可参考如下方法:

${A[@]} 或 ${A[*]} 可得到 a b c def (全部组数)

${A[0]} 可得到 a (第一个组数),${A[1]} 则为第二个组数...

${#A[@]} 或 ${#A[*]} 可得到 4 (全部组数数量)

${#A[0]} 可得到 1 (即第一个组数(a)的长度),${#A[3]} 可得到 3 (第四个组数(def)的长度)

A[3]=xyz 则是将第四个组数重新定义为 xyz ...

11、三个重要符号

hard quote:' ' (单引号),凡在 hard quote 中的所有 meta 均被关闭。

soft quote: " " (双引号),在 soft quoe 中大部份 meta 都会被关闭,但某些则保留(如 $ )。

escape : \ (反斜杠),只有紧接在 escape (跳脱字符)之后的单一 meta 才被关闭。

例如:命令echo '$0 outside function is '$0,第一个$0不会解开,直接输出字符"$0",而第二个$0会被解开,输出当前shell script的路径;

如果用命令echo "$0 outside function is "$0,则两个$0都会被解开,因此不能达到想要的结果。

(注意:在vim中编写shell script时,vim的颜色提示就可以看出符号是否解开,即是按普通字符串处理,还是按meta处理)

12、读取文件

读取文件的一行:read str < file.txt

逐行读取文件
while read line
do
       echo $line
done < file.txt

13、执行数值计算的三种方式

num1=123
num2=100

#(1)declare声明方式
declare -i sum=$num1+$num2

#(2)$(())操作符方式
sum=$((num1 + num2))

#(3)expr命令方式,$()为执行命令,expr是计算命令
sum=$(expr $num1 + num2 )

注意:方式1中+左右不能有空格,方式2可有可无,方式3中必须加空格,否则会按字符串方式连接; 另外,方式2中变量前的$符号可以省略。


14、shell变量详解(变量高级内容)

http://www.cnblogs.com/barrychiao/archive/2012/10/22/2733210.html

计算字符串长度:

 ${#string}

抽取子串:

 ${string:position}       #从名称为$string的字符串的第$position个位置开始抽取子串

 ${string:position:length}   #从名称为$string的字符串的第$position个位置开始抽取长度为$length的子串

删除子串:

 ${string#substring}    #删除string开头处与substring匹配的最短子串

 ${string##substring}  #删除string开头处与substring匹配的最长子串

 ${string%substring}    #删除string结尾处与substring匹配的最短子串

 ${string%%substring}   #删除string结尾处与substring匹配的最长子串

替换子串:

替换子串命令都是${…}格式,可以在任意处、开头处和结尾处替换满足条件的子串

 ${string/substring/replacement}          #仅替换第一次与substring相匹配的子串

 ${string//substring/replacement}        #替换所有与substring相匹配的子串

 ${string/#substring/replacement}         #替换string开头处与substring相匹配的子串

 ${string/%substring/replacement}        #替换string结尾处与substring相匹配的子串

【其他杂项】

( ):将其内的命令置于 nestedsubshell 执行,或用于运算或命令替换。(变量修改是临时的)

{ }:将其内的命令置于 non-namedfunction 中执行,或用在变量替换的界定范围。(变量修改对本shell有效)

${ }或` `(反引号):用来做命令替换,也就是执行括号里面的命令行,然后返回命令行执行的结果。
$(( )):用来做整数计算。如:

$ a=5; b=7; c=2

$ echo $(( a+b*c ))
(( )):可重定义变量值,或作条件测试。如:

a=5; ((a++)) 可将 $a 重定义为 6

a=5; b=7; ((a < b)) 会得到0 (true) 的返回值。

命令、函数或者shell脚本的返回值只有两种:0为"真"( true ),非0为"假"( false )

$#: 添加到Shell的参数个数
$$: Shell本身的PID(ProcessID)
$!: Shell最后运行的后台Process的PID
$?: 最后运行的命令的结束代码(返回值)
$*: 所有参数列表。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
$@: 所有参数列表。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。

为了防止打错变量名造成错误检查困难,可以设置:变量必须先声明(定义)才能使用!可以打开shell的选项(OPTNAME)nounset,关于选项可以执行set -o列出。打开该选项可以执行:set -o nounset 或者 shopt -s -o nounset
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: