I have practiced for flow control, referencing a sample script like;
if [ $(id -u) = "0" ]; then dir_list="/home/*" else dir_list=$HOME fi for home_dir in $dir_list; doThe above is partly quoted lines from "Flow Control - Part 3"
Then,to check how the wildcard in a variable behaves in for flow control, I tried the lines below;
#!/bin/bash
binlist="~/bin/*"
for i in $binlist; do
echo $i
doneI wanted the wildcard to expand and all files in ~/bin/ to be displayed as outputs, but it did not happen. The output is just ~/bin/*.
If I do not use the variable, and directly assign ~/bin/* into the list of for, what I expect happens, all files in ~/bin/ are displayed.
QUESTION=====
How can I enable for a wildcard in variable to expand?
Or am I misunderstanding what the sample code of the reference site intends?
=============
Thank you for your reading my question!
81 Answer
You can use the bash variable for your home directory instead of ~.
The bash variable for your home directory is $HOME so your script should look like this:
#!/bin/bash
binlist="$HOME/bin/*"
for i in $binlist; do
echo $i
doneAlternatively, you could use /home/$USER instead of $HOME like this:
#!/bin/bash
binlist="/home/$USER/bin/*"
for i in $binlist; do
echo $i
doneYou can view each one of these variables by running the following commands:
echo $HOME
echo $USERThese are listed under "Shell Variables" on the bash manpage.
Also, as mentioned by @John1024, the tilde will not expand to $HOME if it is placed within quotes so your third option would be to use the following:
#!/bin/bash
binlist=~/"bin/*"
for i in $binlist; do
echo $i
doneand as mentioned by @bac0n the quotation marks are not necessary here so you can also use the following:
#!/bin/bash
binlist=~/bin/*
for i in $binlist; do
echo $i
done 6