为什么要回显文件名?
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。