Bash Сценарий: Как включить fo r подстановочный знак в переменной для расширения в управлении потоком fo r? - proUbuntu
1 голос
/ 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/.

ВОПРОС =====

Как я могу включить fo r подстановочный знак в переменной для расширения?

O r Я неправильно понимаю, что это за пример кода ссылки сайта намеревается?

=============

Спасибо за r вы r читаете мой вопрос!

1 Ответ

1 голос
/ 23 августа 2020

Вы можете использовать bash переменную fo r you r home directory вместо ~.

Переменная bash fo r you r home directory - $HOME, поэтому ваш сценарий r должен выглядеть так:

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

Они перечислены под r «Переменные оболочки» на странице bash man.

Кроме того, , как упоминалось @ John1024 , тильда не будет расширяться до $HOME, если она помещена в кавычки, поэтому вы r третий вариант будет использовать следующее:

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