首页 > 代码库 > bash

bash

                        Bash脚本基础

     BASH = GNU Bourne-Again Shell,BASH 是 GNU 组织开发和推广的一个项目。Bash脚本类似批处理,简单来讲就是把许多的指令集合在一起,并提供循环、

条件、判断等重要功能,语法简单实用,用以编写程序,大大简化管理员的操

作,并可以完成图形工具所无法实现的功能。

一 如何创建新shell脚本?

1. 创建包含bash命令的文本文件。文件的第一行应为:

#!/bin/bash

2. 使文件可执行(使用chmod +x scripts)

3. 将文件放置在用户的$PATH的目录中

~/bin – 用于用户的私有程序

/usr/local/bin – 本地开发、系统上的其他人使用的脚本

/usr/local/sbin - 本地开发、由root使用的脚本


直接运行脚本和使用source命令运行脚本是不同的!

脚本调试模式:

#!/bin/bash -x

# bash -x scripts

技术分享

二 引用和转义

引用和转义在shell解析字符串时用于去除字符串中特殊字符或保留词语的特殊含义。这会导致按字

面处理字符串,而不是展开变量或将其部分内容视作具有特殊含义。

引用有三种类型:


弱引用

将字符串放置在双引号中,保留字符串中所有字符的文字值,$、`、\和!字符除外。换言之,变量

扩展和命令扩展在双引号内仍起作用。

echo “can I have a $FRUIT”

echo “The current time is $(date +%r).”


强引用

将字符串放置在单引号中,保留字符串中所有字符的文字值,同时禁用所有扩展:

echo “Make $$$ Fast”

技术分享

转义

非引用的\是转义字符。它保留了下一个字符的文字值。(例如,\$PATH是确切的字符串$PATH,而

不是PATH变量的内容。)

echo Make \$\$\$ Fast\!


[root@server0 ~]# echo # not a comment #

[root@server0 ~]# echo \# not a comment #

# not a comment

[root@server0 ~]# echo \# not a comment \#

# not a comment #

[root@server0 ~]# echo ‘# not a comment #‘

# not a comment #

[root@server0 ~]# echo ‘$HOME‘

$HOME

[root@server0 ~]# echo ‘`pwd`‘

`pwd`

[root@server0 ~]# echo ‘"Hello,world"‘

"Hello,world"

www.westos.org

6[root@server0 ~]# echo "$HOME"

/root

[root@server0 ~]# echo "`pwd`"

/root

[root@server0 ~]# echo ""Hello, world""

Hello, world

[root@server0 ~]# echo "\$HOME"

$HOME

[root@server0 ~]# echo "\`pwd\`"

`pwd`

[root@server0 ~]# echo "\"Hello, world\""

"Hello, world"

技术分享

三 Shell变量

shell变量用于为稍后在脚本中使用的名称指定值,并且仅限于shell命令行或从中声明变

量的脚本。

若要定义或指定值:

FRUIT=apple

若要参考或使用变量:

$FRUIT

${FRUIT}


[root@server0 ~]# FIRST=John

[root@server0 ~]# LAST=Doe

[root@server0 ~]# echo $FIRST $LAST

John Doe

[root@server0 ~]# echo $FIRST_$LAST

Doe

[root@server0 ~]# echo ${FIRST}_$LAST

John_Doe

技术分享

四 命令替换

命令替换在子shell中执行指定命令并用命令输出替换脚本中的命令替换。


语法:

$(shell command)


示例:

touch datafile.$(id -un)

TODAY=$(date +%Y-%m-%d)

技术分享


五 算术运算符

算术运算符指的是可以在程序中实现加、减、乘、除等数学运算的运算符。

operator meaning

<VARIABLE>++ 增量后

<VARIABLE>-- 减量后

- 减法

+ 加法

** 幂运算

* 乘法

/ 除法

% 余数

+= 加等

-= 减等

1 Shell计算命令:


用$[]表示数学运算。

# echo $[1+2]

# a=1; echo $[$[$a+1]*2]


用expr表示数学运算。

# echo `expr 1 + 2`


用let指示数学运算。

# let A=1+2

# echo $A


用(())表示数学运算。bash内建功能,效率高。


#!/bin/bash

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

do

((j+=i))

done

echo $j

技术分享

技术分享

六 循环

1.for循环用于值列表中的相同命令的重复。

[root@server0 ~]# for HOST in host{1..3};do echo $HOST;done

host1

host2

host3

[root@server0 ~]# for NUM in $(seq 2 2 8);do echo $NUM;done

2

4

6

8

技术分享


2.循环与计算结合:

#!/bin/bash

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

do

((j+=i))

#j=`expr $j + $i`

#let j+=i

#j=$[j+=i]

done

echo $j


也可以写成一行:

# for((i=0; i<=100; i++));do j=`expr $j + $i` ;done;echo $j

技术分享


技术分享

技术分享

3.数据库备份示例:

#!/bin/bash

for DB in $(mysql -e "show databases;" -E -N | grep -v ‘^*‘ | grep -v ‘schema$‘)

do

echo "Backing up $DB"

mysqldump $DB > /dbbackup/$DB.dump

done

echo ""

for DBDUMP in /dbbackup/*

do

SIZE=$(stat --printf "%s\n" $DBDUMP)

echo "$DBDUMP

$SIZE"

done

echo “The current time is $(date +%r).”


七 Bash位置参数

有两种简单的方法可以将用户输入读入bash中的变量。第一个方法是使用read提示用

户输入(使用-p选项)并将其直接存储到一个或多个变量:


交互式输入

# read -p ‘Enter your first and last name: ‘ FIRST LAST

另一个方法是使用位置参数来读取传递给脚本的命令行参数或选项输入。各种特殊

变量存储传递的选项编号

Bash解析的个别参数或整个原始命令行。

指定的位置参数总数:$#

位置参数自身:$0、$1、$2、$3....

所有位置参数: $@、$*


退出状态

Linux命令完成时,将返回退出状态。成功完成程序时,将返回0的推出状态。这被bash

当作逻辑True值。非零退出状态通常表示发生了错误,并且被bash当作逻辑False值。


例如:grep的退出状态的含义:

0 – 在指定的文件中找到了模式

1 – 在指定的文件中未找到模式

>1 – 一些其他错误(无法打开文件、错误的搜索表达式等)

推出状态的值被存储在"?"中,可以使用以下命令查看:

# echo $?


八 test条件判断

   test命令可用于评估bash脚本中的表达式。它评估其参数所指定的表达式,如果表达式

为true,返回零退出状态,如果表达式为false,则返回非零退出状态。test具有替代语

法,使用方括号"[]"将表达式括起来,这样更易于阅读。


语法:test EXPRESSION 或 [EXPRESSION]

1. 非零或零长度字符串运算符:test -{n|z} STRING

[root@server0 ~]# [ -n westos ]; echo $?

0

[root@server0 ~]# [ -z westos ]; echo $?

1


2. 字符串比较运算符:=、!=

[root@server0 ~]# [ abc = abc ]; echo $?

0

[root@server0 ~]# [ abc = ABC ]; echo $?

1

[root@server0 ~]# [ abc != ABC ]; echo $?

0

3. 数字比较运算符:-eq、-ne、-lt、-le、-gt、-ge

[root@server0 ~]# [ 1 -eq 1 ]; echo $?

0

[root@server0 ~]# [ 1 -ne 1 ]; echo $?

1

[root@server0 ~]# [ 1 -gt 2 ]; echo $?

1

www.westos.org

4. 文件状态运算符:test -{b|c|e|f|d|r|w|x|s|L} FILE/DIRECTORY

[root@server0 ~]# [ -b /dev/sda ]; echo $?

1

[root@server0 ~]# [ -c /dev/zero ]; echo $?

0

[root@server0 ~]# [ -e /etc/passwd ]; echo $?

0

[root@server0 ~]# [ -f /etc/passwd ]; echo $?

0

[root@server0 ~]# [ -d /etc/passwd ]; echo $?

1

[root@server0 ~]# [ -L /etc/passwd ]; echo $?

1


5.二进制文件运算符:-ef、-nt、-ot

[root@server0 bin]# [ /bin/mount -ef /usr/bin/mount ]; echo $?

0

[root@server0 bin]# [ /bin/mount -nt /usr/bin/mount ]; echo $?

1

[root@server0 bin]# [ /bin/mount -ot /usr/bin/mount ]; echo $?

1

逻辑运算符:-o、-a、!、&&、||

[root@server0 bin]# [ 2 -gt 1 -a 1 -gt 2 ]; echo $?

1

[root@server0 bin]# [ 2 -gt 1 -o 1 -gt 2 ]; echo $?

0

[root@server0 bin]# [ ! 2 -gt 1 ]; echo $?

1


bash