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

相關內容