shell 三则

一、为了检测用户输入的有效性,我使用了一个循环,只有通过以后才能跳出这个循环:

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数据库里面有的……

updatedupdated2022-02-222022-02-22