今天写 Shell 的时候碰到了一个坑。
比如我想判断一个命令是否存在,我想着就用 test 的-x 吧,判断一个文件是否存在且具有执行权限,于是我写出了下面这段代码:
PIP=`which pip`
if [ ! -x ${PIP} ];then
echo "NO"
else
echo "YES"
fi
然后我发现不对啊,为啥 pip 不存在的时候,还是输出 YES 呢,然后坑爹的发现, test 的-x
和-e
后面不接参数的时候,默认为 True ,上面的那段代码由于 pip 命令不存在,所以${PIP}
为空,就是空,什么都没有。然后就相当于运行的是if [ ! -x ];then
,而这种情况下返回 True (什么鬼,为什么会这么设计)。
然后我就想,那就在${PIP}
两边加上字符串吧,于是乎写成了这样:
PIP=`which pip`
if [ ! -x '${PIP}' ];then
echo "NO"
else
echo "YES"
fi
这时我发现,这样 pip 命令不存在的情况下会变输出 NO 了,但是 pip 存在的情况下为啥还是 No 捏!然后坑爹的发现,原来上面的语句相当于是执行if [ ! -x '/usr/local/bin/pip'];then
,这种情况下竟然返回的是 True ,然后我就搞不懂了,这是什么设计。
然后我老老实实地打开 Google ,搜了一下 Bash 中判断一个命令是否存在的办法,于是乎发现判断返回值就可以了,于是这样的代码就可以了:
if ! command -v pip > /dev/null 2>&1;then
echo "YES"
fi
我感到很困惑的是,为什么 Bash 的字符串要这么设计,虽说是弱类型语言吧,但也不要这样傻傻分不清吧。也曾想过以后用 Bash 来做的事情,统一用 Python 来做。但是发现, Python 处理起字符串来,真不如 Bash 的 cat , sort , uniq , wc , awk 这一套撸的方便。请问大家觉得如何,大家平常都是如果处理这种工作的,就是需要固定地执行几十条命令的工作!
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.