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.


Также,как упомянул @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

Связанный контент