我已经练习了for
流程控制,参考了类似的示例脚本;
if [ $(id -u) = "0" ]; then
dir_list="/home/*"
else
dir_list=$HOME
fi
for home_dir in $dir_list; do
以上内容摘自“流量控制-第 3 部分”http://linuxcommand.org/lc3_wss0130.php
然后,为了检查变量中的通配符在流控制中的行为for
,我尝试了下面的几行;
#!/bin/bash
binlist="~/bin/*"
for i in $binlist; do
echo $i
done
我希望通配符能够扩展,并且 中的所有文件~/bin/
都显示为输出,但这并没有发生。输出只是~/bin/*
。
如果我不使用变量,而是直接分配~/bin/*
到列表中for
,则会发生我期望的情况,即~/bin/
显示中的所有文件。
问题=====
如何才能使变量中的通配符得以扩展?
或者我误解了参考站点的示例代码的目的?
=============
感谢您阅读我的问题!
答案1
您可以使用 bash 变量作为您的主目录,而不是~
。
您的主目录的 bash 变量$HOME
应该是这样的:
#!/bin/bash
binlist="$HOME/bin/*"
for i in $binlist; do
echo $i
done
或者,你可以/home/$USER
像$HOME
这样使用:
#!/bin/bash
binlist="/home/$USER/bin/*"
for i in $binlist; do
echo $i
done
您可以通过运行以下命令来查看每个变量:
echo $HOME
echo $USER
还,正如@John1024 所提到的,如果将波浪号放在引号内,则波浪号不会扩展为,$HOME
因此第三个选择是使用以下内容:
#!/bin/bash
binlist=~/"bin/*"
for i in $binlist; do
echo $i
done
和正如@bac0n 所提到的这里不需要引号,因此您也可以使用以下内容:
#!/bin/bash
binlist=~/bin/*
for i in $binlist; do
echo $i
done