echo имя переменной в цикле for

Параметр -i в sudo пытается создать оболочку входа в систему, которая, в свою очередь, запускает оболочку, выбранную пользователем. Вы установили это на / bin / false в вашем / etc / passwd :

$ grep userB /etc/passwd
userB:x:Z08:WW9::/home/userB:/bin/false

Попробуйте запустить:

sudo -u userB ls

Если это работает, значит, все работает так, как вы его настроили. к. Если вам нужна интерактивная оболочка, используйте вместо нее -s , которая не будет вызывать оболочку входа пользователя.

Если вам нужна полная оболочка для входа в систему, вы должны изменить оболочку пользователя на

sudo chsh -s /bin/bash userB
2
19.06.2017, 15:23
4 ответа

Используйте одинарные кавычки:

for i in '$test1' '$test2' '$test3'; do
    echo "$i"
done

или, иначе, экранируйте знаки доллара обратной косой чертой:

for i in \$test1 \$test2 \$test3; do
    echo "$i"
done
3
27.01.2020, 21:48

Значение for i in "$test1" "$test2" "$test3"состоит в том, что:$iбудет содержать содержимое трех переменных test1, test2, test3 -, которое фактически содержит :1, 2, 3

Если вы хотите напечатать test1 , test2 и test3 , вы должны вызывать их без знака $, т.е. фактическое имя, а не их значение

Следующий код (без $перед переменными test1/2/3напечатает то, что вы хотите:

test1="1"
test2="2"
test3="3"

for i in "test1" "test2" "test3"; do
        echo "$i"
done ;

результат выполнения:

test1
test2
test3
2
27.01.2020, 21:48

Если вы действительно хотите сделать это, просто сделайте это:

#!/bin/bash
test1='1'
test2='2'
test3='3'
for v in "test1" "test2" "test3"; do
        echo "The variable's name is $v"
        echo "The variable's content is ${!v}"
done 

Но вы, вероятно, предпочтете использовать массивы , а не имена динамических переменных, поскольку это может рассматриваться как плохая практика и затрудняет понимание вашего кода. Так что рассмотрите эту, гораздо лучше, форму:

#!/bin/bash
test[0]='1'
test[1]='2'
test[2]='3'
for ((i=0;i<=2;i++)); do
        echo "The variable's name is \$test[$i]"
        echo "The variable's content is ${test[$i]}"

done 
15
27.01.2020, 21:48

кш93 или Баш:

$ test1=aa; test2=bb; test3=cc
$ for x in "${!test@}" ; do echo "$x" ; done 
test1
test2
test3

(обратите внимание, что переменные раскрываются в лексическом порядке (, поэтому test10стоит передtest2)).

2
27.01.2020, 21:48

Теги

Похожие вопросы