一、为了检测用户输入的有效性,我使用了一个循环,只有通过以后才能跳出这个循环:
while true; do read -p "Your name: " NAME if [[ -n "$NAME" ]]; then break fi done
问题是,假如每个变量都这样写一个循环的话实在吃不消,封装成一个函数吧,可是要怎么写呢?
get_value () { _PROMOTE=$1 _VAR=$2 while true; do read -p "$_PROMOTE" $_VAR if [[ -n "$_VAR" ]]; then break fi done } get_value "Your name: " NAME echo $NAME
二、我希望错误输出能更直观一点,既要能让用户直接看出来是什么错误,又希望能脚本能直接exit出对应的值,有点像关联数组的形式,要怎么写呢?用eval
SUCCESS=0 ERROR_NOT_FOUND=1 ERROR_XXXX=2 # and more... pexit () { _ERROR=$1 echo $_ERROR >&2 eval exit "\$$_ERROR" } pexit ERROR_NOT_FOUND
程序输出:
lyre@4179e1:~> ./test.sh ERROR_NOT_FOUND lyre@4179e1:~> echo $? 1
三、我希望查询当前发行版的名称/版本/类型,比如RHEL 6.2 x86_64,在我的这个需求中只需要考虑RHEL和SLES,怎么查比较准确呢?常见的做法是检查/etc/issue 和 /etc/redhat-release 或者 /etc/SuSE-release。或者更通用一点的办法,执行lsb_release -a。可是有些客户比较那啥,为了装oracle直接把/etc/issue给改成另一个发行版的了,这就带来问题了。
讨论了一会之后,ldc同学提出可以rpm -q /etc/issue查到这个文件属于哪个包,直接看包名就知道了。有同样需求的不妨试试。
/etc/issue不存在?没关系,rpm数据库里面有的……