Ответ roaima отвечает на вопрос, который вы на самом деле задали:
Q: В чем разница между этими двумя кодовыми блоками? Почему они выдают разные результаты?
A: Первый цикл перебирает аргументы командной строки; второй цикл перебирает аргументы числа (индексы).
... хотя я полагаю, что вы бы сами это поняли еще через шесть-восемь минут - это вроде очевидно. Вы, вероятно, хотите, чтобы вторая программа сделала что-то вроде
echo $$i # This doesn't do what you want.
для отображения аргумента, индексированного числом
, который хранится в переменной i
(и обозначается как $ i
).
Как отмечено в комментарии, это не то, что вы хотите.
(Он что-то делает;
Я призываю вас поэкспериментировать и выяснить , что он делает.)
Но это близко к чему-то, что действительно работает:
eval echo \$$i # Don't do this.
или, что эквивалентно,
eval echo '$'"$i" # Don't do this.
Эти команды
i
(одно из чисел 1, 2, 3, ...) $
, образуя $ 1
, $ 2
, $ 3
и т. д. eval
команда, чтобы сказать: «возьмите эту командную строку
, которую я только что создал, и eval измените ее так, как если бы я ее набрал. Так что это будет иметь эффект выполнения
echo $1
echo $2
echo $3
︙
Но, как подсказывают комментарии, вы должны попытаться избежать этого.
eval
может быть опасным, если вводится что-либо, кроме простых слов.
Поиск этот сайт; вы найдете множество объяснений этому.
Но есть довольно безопасный способ заставить вторую программу делать то же самое, что и первая: изменить
echo $i
на
echo ${!i}
Хорошо, прежде всего, $ {i }
почти то же самое, что $ i
.
!
дает эффект, аналогичный эффекту команды eval
-
$ {! X}
ищет значение x
( т.е. $ x
или $ {x}
)
и использует , что в качестве имени переменной для поиска.
Итак, если x = foo
, то $ {! X}
совпадает с $ foo
.
Приведенный выше код делает то же самое с i
,
выбирая параметр, имя которого является значением i
.
Кстати, вы всегда должны указывать все ссылки на переменные оболочки
(например, «$ i»
, «$ #»
, » $ args "
, " $ {i} "
и " $ {! i} "
)
, если у вас нет веской причины не делать этого, {{ 1}}, и вы уверены, что знаете, что делаете.
X -Windows имеет режим киоска, который можно использовать для запуска приложения, обычно веб-браузера, в качестве единственного запущенного приложения, без загрузки полного оконного менеджера. Я не знаю, будет ли это работать с Winamp, но вы можете попробовать (из консоли):
startx /path/to/winamp --kiosk