Bash条件取反方法?Android目录检测及ADB脚本疑问
解答:检测Android目录是否存在及Bash脚本优化
嗨,作为刚接触Bash的新手,你的问题其实很典型,我来一步步帮你拆解清楚~
1. 先搞懂2> /dev/null的含义
在Bash中,每个进程都有三个默认的文件描述符:
1:标准输出(stdout),就是命令正常执行后输出的内容2:标准错误(stderr),就是命令执行出错时弹出的报错信息(比如ls找不到目录时的No such file or directory)0:标准输入(stdin),就是你从键盘输入的内容
2> /dev/null的作用就是把标准错误输出重定向到/dev/null——这个特殊文件相当于系统的“数据黑洞”,任何写入它的内容都会被直接丢弃,不会显示在终端上。你原脚本里加它是为了避免报错信息干扰,这个思路没问题,但判断逻辑还有优化空间。
2. 原脚本的问题:别用ls输出做判断
你原脚本里的if [ adb shell ls ${test_dir} 2> /dev/null ]是个常见误区:这里的[]是把adb shell ls的输出当成字符串,判断它是否非空。但这种方式有漏洞:
- 如果目录存在但里面没有文件,
ls输出空字符串,条件会被判为“假”,误报“目录不存在” - 如果目录存在但有大量文件,输出内容过多也可能导致判断异常
更可靠的方式是直接判断命令的退出状态:Bash中,命令执行成功返回0(视为“真”),失败返回非0值(视为“假”)。我们可以在Android的shell里直接用目录检测命令,而非依赖ls。
3. 如何取反条件,只关心目录不存在的情况
我们可以用adb shell直接在设备上执行目录存在性检测,再用!在Bash中取反条件。具体实现:
- 在Android的shell里,用
[ -d "目录路径" ]判断目标路径是否为存在的目录(-d是directory的缩写) - 在Bash中,用
!对命令结果取反,这样当目录不存在时,条件为真,执行我们需要的逻辑
修正后的脚本示例
# 替换成你要检测的Android设备目录 test_dir="/sdcard/your_target_dir" # 取反条件:当目录不存在时执行echo逻辑 if ! adb shell '[ -d "$test_dir" ]'; then echo "目录不存在" else echo "目录存在" fi
脚本细节解释
adb shell '[ -d "$test_dir" ]':在Android设备的shell中执行检测,目录存在则返回0(成功),不存在返回非0(失败)!:Bash的取反运算符,把命令的退出状态反转——原本目录不存在时命令返回非0(假),取反后变为“真”,进入if块执行逻辑- 用双引号包裹
$test_dir是为了避免目录路径含空格等特殊字符时出错
内容的提问来源于stack exchange,提问作者CoXier
相关产品推荐
相关产品推荐

