[翻译]Bash编程简介

原文:http://www.faqs.org/docs/Linux-HOWTO/Bash-Prog-Intro-HOWTO.html


2. 简单的脚本

  2.1 传统的hello world脚本


#!/bin/bash
echo hello world
  2.2 一个很简单的备份脚本



#/bin/bash
tar -czf /var/my-backup.tgz /home/me/
 当然这个脚本几乎是不可用的。



  3. 关于重定向的一切

    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.txt
         3.4 示例:stdout定向stderr



greb da* 1>&2
         3.5 示例:stderr定向到stdout



grep * 2>&1
          3.6 示例:将stderr和stdout定向到文件



rm -f $(find / -name core ) &> /dev/null


4.管道 

      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$"


5. 变量

 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. 条件语句

    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
fi
       6.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
fi
       6.4 示例:带变量的条件表达式



#!/bin/bash
T1="foo"
T2="bar"
if[ "$T1" == "$T2" ]; then
    echo expression evaluated as true
else
    echo expression evaluated as false
fi


7.循环语句,for,while,until

    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
done
      7.4 Until示例



#!/bin/bash
COUNTER=20
until [ $COUNTER - lt 10 ]; do
    echo COUNTER $COUNTER
    let COUNTER-=1
done


8. 函数    


  函数用来组织代码。

   8.1 函数示例:


#!/bin/bash
function quit {
    exit
}
function hello {
    echo Hello !
}
hello
quit
echo foo
  8.2 带参数的函数示例


  

#!/bin/bash
function quit {
    exit
}
function e {
    echo $1
}
e Hello is
e "world is big"
quit
echo foo



9. 用户接口

   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
done
    9.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 杂项 

    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 

   可以输出一些有用的信息。

 

             






你可能感兴趣的:(bash,bash编程简介,bash编程入门)