原文:http://www.faqs.org/docs/Linux-HOWTO/Bash-Prog-Intro-HOWTO.html
2.1 传统的hello world脚本
#!/bin/bash echo hello world2.2 一个很简单的备份脚本
#/bin/bash tar -czf /var/my-backup.tgz /home/me/当然这个脚本几乎是不可用的。
3.1 理论与快速参考
有三个文件描述符(stdin,stdout,stderr) (std=standard)
加文件普通的文件。
基本上你可以:
1.将stdout定向到一个文件
2.将stderr定向到一个文件
3.将stdout定向到stderr
4.将stderr定向到stdout
5.将stderr和stdout定向到一个file
6.将stderr和stdout定向到stdout
7.将stderr和stdout定向到stderr
1代表stdout,2代表stderr
3.2 示例:stdout定向到文件
ls -l > ls-l.txt
3.3 示例:stderr定向到文件
grep da*2 >grep-errors.txt3.4 示例:stdout定向stderr
greb da* 1>&23.5 示例:stderr定向到stdout
grep * 2>&13.6 示例:将stderr和stdout定向到文件
rm -f $(find / -name core ) &> /dev/null
4.1 管道是什么及为什么需要管道
管道可以将一个程序的输出作为另一个程序的输入
4.2 示例:使用sed的简单管道
ls -l | sed -e "s/[aeio]/u/g"
==============START 强势插入测试===========
banxi1988@banxi:~/work/bash$ ls -l 总用量 36 -rwxrwxr-x 1 banxi1988 banxi1988 102 11月 6 14:20 bcr.sh -rw-rw-r-- 1 banxi1988 banxi1988 29 12月 1 10:53 helloworld_2_1.sh -rw-rw-r-- 1 banxi1988 banxi1988 75 12月 1 02:05 str_add.sh banxi1988@banxi:~/work/bash$ ls -l |sed -e "s/[aeio]/u/g" 总用量 36 -rwxrwxr-x 1 bunxu1988 bunxu1988 102 11月 6 14:20 bcr.sh -rw-rw-r-- 1 bunxu1988 bunxu1988 29 12月 1 10:53 hulluwurld_2_1.sh -rw-rw-r-- 1 bunxu1988 bunxu1988 75 12月 1 02:05 str_udd.sh banxi1988@banxi:~/work/bash$
==============THE END ===================
4.3 示例:ls -l *.txt的另一种写法
ls -l |grep "\.txt$"
bash中的变量是没有类型的。不需要先声明,赋值后直接可用。
5.1 示例:使用变量的Hello World!
#!/bin/bash STR="HELLO WORLD!" echo $STR第二行声明了一个变量 STR,将给一个字符串值。
第二行通过在变量名前面加一个'$'来获得变量的值。搞不清楚什么时候用$var和什么时候用var的想想这句话吧。
(注:这是有一个坑,就是变量赋值时等号两边不能有空格的哦!)
5.2 示例:一个很简单的备份脚本(一点点改进)
#!/bin/bash OF=/var/my-backup-$(date +%Y%m%d).tgz tar -cZf $OF /home/me
注意第二行的表达式'$(date +%Y%m%d)' 如果你运行这个脚本你会发现它会在括号内运行命令,并获得输出。
5.3 局部变量
可以使用关键词local来创建局部变量
#!/bin/bash HELLO=hello function hello { local HELLO=World echo $HELLO } echo $HELLO hello echo $HELLO
注意函数名hello后面有空格哦,这又是一个坑啊。
6.1 纯理论
条件语句有多个形式最基本的形式就是: if expression then statement
当expression计算为true时,statement就会被执行。
条件语句还有这样的形式:
if expression then statement1 else statement2
如果expression计算为真,则执行statement1,否则执行statement2。
另一种条件语句的形式就是: if expression then statement1 else if expression2 then statement2 else statement3
这样来组合多个判断条件。
bash中的基本if语句就如下面的:
if [ expression ]; then code if 'expression' is true fi6.2 示例:基本的条件语句if .. then
#!/bin/bash if [ "foo" == "foo" ]; then echo expression evaluated as true fi注意:中括号与表达式之间需要有空格。 双等号两边也需要空格 又是一个与空格有送的坑啊。
6.3 示例:基本的if .. then ... else条件语句
#!/bin/bash if [ "foo" == "foo" ]; then echo expression evaluated as true else echo expression evaluated as false fi6.4 示例:带变量的条件表达式
#!/bin/bash T1="foo" T2="bar" if[ "$T1" == "$T2" ]; then echo expression evaluated as true else echo expression evaluated as false fi
7.1 for循环示例:
#!/bin/bash for i in $( ls ); do echo item:$i done
第四行的'done' 表明$i的使用已经结束,$i可以用一个新值。
7.2 C风格的for循环:
#!/bin/bash for i in `seq 1 10`; do echo $i done
7.3 While循环语句
#!/bin/bash COUNTER=0 while [ $COUNTER -lt 10 ] ;do echo COUNTER $COUNTER let COUNTER=COUNTER+1 done7.4 Until示例
#!/bin/bash COUNTER=20 until [ $COUNTER - lt 10 ]; do echo COUNTER $COUNTER let COUNTER-=1 done
函数用来组织代码。
8.1 函数示例:
#!/bin/bash function quit { exit } function hello { echo Hello ! } hello quit echo foo8.2 带参数的函数示例
#!/bin/bash function quit { exit } function e { echo $1 } e Hello is e "world is big" quit echo foo
9.1 使用select语句来做简单的菜单
(注:本人未测试成功)
#!/bin/bash OPTIONS="Hello Quit" select opt in $OPTIONS;do if [ "$opt" = "Quit" ]; then echo done exit elif [ "$opt" = "Hello" ]; then echo hello World else clear echo bad option fi done9.2 使用命令行
#!/bin/bash if [ -z "$1" ];then echo usage: $0 directory exit fi SRCD=$1 TGTD="/var/backups/" OF=home-$(date +%Y%m%d).tgz tar -cZf $TGTD$OF $SRCD
10.1 使用read函数读取用户输入
#!/bin/bash echo Please,enter your name read NAME echo "hi $NAME!"
也许你需要同时读取多个输入,下面的例子会让你知道怎么做的。
#!/bin/bash echo Please,enter your firstname and lastname read FN,LN echo "Hi,$LN,$FN !"(译注:如果输入"banxi Lee 1988",那么FN=banxi,LN=Lee 1988,相信可以帮助你了解read这个函数吧。)
10.2 数学运算
在命令行(或者shell)中,试运行:echo 1 + 1 ,如果你期待看到'2' ,那么你也许会失望。
如果你想让bash帮你做些运算,你应该这样做:echo $((1+1)),
你也可以这样做:echo $[1+1]
如果你运行"echo $[3/4]" 你会得到0,因为bash只用整形回答,如果你运行"echo 3/4 | bc -l",它将返回0.75
10.3 查找bash
你可以使用'locate bash' 来查找(推荐),也可以'find ./ -name bash'在根目录的方式。
或者'which bash'
10.4 从一个程序中获得返回值。
在bash中,从一个程序返回值存储在一个叫做$?的特殊变量中。
#!/bin/bash cd /data &> /dev/null echo rv: $? cd $(pwd) &> /dev/null echo rv: $?以上脚本。第一个rv为1,第二个为0。
10.5 获得一个命令的输出值
#!/bin/bash DBS=`mysql -uroot -e"show databases"` for b in $DBS; do mysql -uroot -e"show tables from $b" done(注:上面的代码,我测试不成功,因为需要密码啊。在-uroot 后面加 -p 就会提示输入密码)
中间跳过:
13. 出错了怎么办
13.1 调用bash的方式
将第一行改为#!/bin/bash -x
可以输出一些有用的信息。