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/
が表示されます。
質問=====
変数のワイルドカードを展開できるようにするにはどうすればよいですか?
それとも、リファレンスサイトのサンプルコードが何を意図しているのか誤解していますか?
=============
私の質問を読んでくれてありがとう!
回答
の代わりに、ホームディレクトリに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