Bash 脚本:如何启用变量中的通配符来扩展流量控制?

Bash 脚本:如何启用变量中的通配符来扩展流量控制?

我已经练习了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

这些在 bash 手册页的“Shell 变量”下列出。


还,正如@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

相关内容