echo无缘无故打印工作目录文件名



为什么要回显文件名?

sinks_index=`pacmd list-sinks | grep "index:"`
for i in $sinks_index
do  
echo $i
done

给出如下输出

audio_name_switcher.sh
audio.py
audio.sh
switch_audio.sh
index:
1
index:
2
index:
3

但是在shell中运行pacmd list-sinks | grep "index:"会得到* index: 1 index: 2 index: 3

pacmd返回*模式。

for ... in ...; do ... done循环中,列表模式包含*,没有任何保护。

因此,bash将*替换为当前目录中找到的所有文件。

这是glob功能。

您可以使用GLOBIGNORE变量暂时停用glob(参见man bash):

#! /bin/bash
sinks_index='* index: 1 index: 2 index: 3'
GLOBIGNORE="*"
echo "With GLOBIGNORE"
for i in $sinks_index
do
echo "UNSET GLOB: " $i
unset GLOBIGNORE
echo "  SET GLOB: " $i
echo "  SET GLOB: $i"
done
unset GLOBIGNORE

在中重新激活全局后和循环。

  • In:其他东西可能需要;
  • After:如果列表为空,则不进入循环。

关于$i"$i"在循环中重新激活glob后的注意事项:

  • "..."停止glob保护bash echo命令,但不停止${...}解释。

您应该为sinks_index使用数组,而不是标量:

sinks_index=( $(pacmd list-sinks | grep "index:") )
for i in "${sinks_index[@]}"
do  
echo "$i"
done

以上将解决你所问的问题,但对pacmd list-sinks的输出做了几个假设,所以考虑这是一个起点,但你可能需要一个更健壮或稍微不同的解决方案,这取决于输出和你实际想用它做什么。

复制/粘贴你的shell脚本到http://shellcheck.net,直到你熟悉shell。

最新更新