在命令执行之前阻止 Bash 扩展通配符

问题描述

我有一个启动脚本 /init 来启动 Linux 嵌入式系统。在那里我有一个功能可以计算 SD 卡中的分区

get_number_of_partitions () { ls ${SDCARD_DEV}P* 2> /dev/null | wc -l; }

它适用于一些 busyBox 版本,但不是所有版本。期望是对分区进行计数,例如 /dev/mmcblk0p1 /dev/mmcblk0p2。当我追踪时,我发现对于非工作情况,P*proc 命令之前扩展为 ls。结果计算出 ${SDCARD_DEV} 的 1 个实例 + 来自 proc 个孩子的大约 100 个项目。

我也试过:ls ${SDCARD_DEV}"P*" 给出了相同的结果。

解决方法

我能想到的唯一方法是如果 ${SDCARD_DEV} 以空格结尾,例如

SDCARD_DEV="/dev/ "

结果,正在执行的命令是

ls /dev/ p*

代替

ls /dev/p*

禁用通配符扩展并不能解决这个问题。首先,ls 本身不进行通配符扩展,它依赖于在调用通配符之前扩展通配符的 shell。其次,ls 仍会将它们视为两个单独的参数,它不会将 p* 解释为要在 /dev 内匹配的文件。

理想情况下,您应该首先弄清楚为什么将空间添加到变量中,然后解决这个问题。如果没有,您可以在使用变量之前将其删除:

SDCARD_DEV="$(sed 's/ *$//' <<< "$SDCARD_DEV")"