Bashスクリプト:変数のワイルドカードをフロー制御のために展開できるようにするにはどうすればよいですか?

Aug 23 2020

次の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 mchid Aug 23 2020 at 21:15

の代わりに、ホームディレクトリに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のマンページの「シェル変数」にリストされています。


また、@ John1024で説明されているように、チルダは$HOME引用符で囲まれている場合は展開されないため、3番目のオプションは次を使用することです。

#!/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