Я практиковал 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.
Также,как упомянул @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