【bash学习000】初探bash

Ubuntu 12.04 LTS 操作系统

问题1:假设在当前目录下存在abc,abd,abe等文件,在BASH中运行rm abc ab*命令后,会出现错误吗?如果有错?为什么?

答:有错,提示abc不存在。错误的原因和bash运行命令的机制有关,bash运行命令是先解释后执行。在"rm abc ab*"中,先将ab*解释为abc abd abe,上述命令变为"rm abc abc abd abe",而这个命令执行到第二个abc时,abc已经不存在,所以会报错。

 

问题2: 常见的shell脚本书写格式是什么样子?

答:
#!/bin/bash
#
#scriptname:
#author:
#date_of_creation:
#reversion:
#
#
#platform:
#
#purpose:
#
#
#rev list:
#


#################################
#define files and variables here                           #
#################################

 


#################################
#   define functions here                  #
#################################

 


#################################
#   beginning of main                      #
#################################

2013.4.13 补充,bash脚本应该采纳下面的书写风格

    1.一定要提供注释,方便阅读以及修改;注释一般针对重要变量名和函数,或者解释某个脚本功能;

    2.学会使用变量,不要直接操作常量,以防下次需要修改,直接针对变量操作,例如DIR=/home/xy,下次如果想改成另一个目录,就可以直接针对DIR修改,而不是逐个地修改/home/xy;

    3.为变量和函数取名字,详细一些,便于理解;例如:

fl=`ls -al $dirname` # 太模糊了.

file_listing=`ls -al $dirname` # 更好的取名方式.

     4.灵活使用exit退出符,有大牛建议,使用/usr/include/sysexits.h中的符号。/usr/include/sysexits.h内容为:

#ifndef _SYSEXITS_H

#define _SYSEXITS_H 1



/*

 *  SYSEXITS.H -- Exit status codes for system programs.

 *

 *      This include file attempts to categorize possible error

 *      exit statuses for system programs, notably delivermail

 *      and the Berkeley network.

 *

 *      Error numbers begin at EX__BASE to reduce the possibility of

 *      clashing with other exit statuses that random programs may

 *      already return.  The meaning of the codes is approximately

 *      as follows:

 *

 *      EX_USAGE -- The command was used incorrectly, e.g., with

 *              the wrong number of arguments, a bad flag, a bad

 *              syntax in a parameter, or whatever.

 *      EX_DATAERR -- The input data was incorrect in some way.

 *              This should only be used for user's data & not

 *              system files.

 *      EX_NOINPUT -- An input file (not a system file) did not

 *              exist or was not readable.  This could also include

 *              errors like "No message" to a mailer (if it cared

 *              to catch it).

 *      EX_NOUSER -- The user specified did not exist.  This might

 *              be used for mail addresses or remote logins.

 *      EX_NOHOST -- The host specified did not exist.  This is used

 *              in mail addresses or network requests.

 *      EX_UNAVAILABLE -- A service is unavailable.  This can occur

 *              if a support program or file does not exist.  This

 *              can also be used as a catchall message when something

 *              you wanted to do doesn't work, but you don't know

 *              why.

 *      EX_SOFTWARE -- An internal software error has been detected.

 *              This should be limited to non-operating system related

 *              errors as possible.

 *      EX_OSERR -- An operating system error has been detected.

 *              This is intended to be used for such things as "cannot

 *              fork", "cannot create pipe", or the like.  It includes

 *              things like getuid returning a user that does not

 *              exist in the passwd file.

 *      EX_OSFILE -- Some system file (e.g., /etc/passwd, /etc/utmp,

 *              etc.) does not exist, cannot be opened, or has some

 *              sort of error (e.g., syntax error).

 *      EX_CANTCREAT -- A (user specified) output file cannot be

 *              created.

 *      EX_IOERR -- An error occurred while doing I/O on some file.

 *      EX_TEMPFAIL -- temporary failure, indicating something that

 *              is not really an error.  In sendmail, this means

 *              that a mailer (e.g.) could not create a connection,

 *              and the request should be reattempted later.

 *      EX_PROTOCOL -- the remote system returned something that

 *              was "not possible" during a protocol exchange.

 *      EX_NOPERM -- You did not have sufficient permission to

 *              perform the operation.  This is not intended for

 *              file system problems, which should use NOINPUT or

 *              CANTCREAT, but rather for higher level permissions.

 */



#define EX_OK           0       /* successful termination */



#define EX__BASE        64      /* base value for error messages */



#define EX_USAGE        64      /* command line usage error */

#define EX_DATAERR      65      /* data format error */

#define EX_NOINPUT      66      /* cannot open input */

#define EX_NOUSER       67      /* addressee unknown */

#define EX_NOHOST       68      /* host name unknown */

#define EX_UNAVAILABLE  69      /* service unavailable */

#define EX_SOFTWARE     70      /* internal software error */

#define EX_OSERR        71      /* system error (e.g., can't fork) */

#define EX_OSFILE       72      /* critical OS file missing */

#define EX_CANTCREAT    73      /* can't create (user) output file */

#define EX_IOERR        74      /* input/output error */

#define EX_TEMPFAIL     75      /* temp failure; user is invited to retry */

#define EX_PROTOCOL     76      /* remote error in protocol */

#define EX_NOPERM       77      /* permission denied */

#define EX_CONFIG       78      /* configuration error */



#define EX__MAX 78      /* maximum listed value */



#endif /* sysexits.h */

    5.模块化编程,将复杂而庞大的脚本分割成一个个小的模块,多用函数;

    6.尽量简洁,避免复杂啰嗦的写法。例如:

COMMAND

if [ $? -eq 0 ]

...

# 多余的if判断语句(Redundant and non-intuitive).

if COMMAND

...

#更准确( More concise (if perhaps not quite as legible)).

 

 

 

 

你可能感兴趣的:(bash)