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)).