В сценариях оболочки какая разница между $ i,% i и %% i? - PullRequest
0 голосов
/ 24 апреля 2019

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

Я использую cmder в качестве консоли.Я пытался добавить crypto- ко всем файлам в CWD, и вот что я попробовал:

В этом ответе рекомендуется следующий синтаксис:

for i in *.png ; do mv "$i" "crypto-$i" ; done

я был неожидан в это время.


В этом ответе рекомендуется двойной знак процента %%i:

for %%i in *.png ; do mv "$i" "crypto-$i" ; done

%% я был неожидан в это время.


В этом ответе рекомендуется использовать знак процента вместо знака доллара для i:

for %i in *.png ; do mv "$i" "crypto-$i" ; done

*. Png в это время был неожиданным.

На этот раз я пошел дальше и заметил, что в ответе имя файла заключено в квадратные скобки, поэтому я попытался:

for %i in (*.png) ; do mv "$i" "crypto-$i" ; done

mv "$ i" "crypto- $ i";done
mv: target 'done' не является каталогом

Тогда я решил, что команда также должна быть в скобках:

for %i in (*.png) ; do (mv "$i" "crypto-$i") ; done

Выполнено было неожиданнов это время.

После этого я решил попробовать без ;:

for %i in (*.png) do (mv "$i" "crypto-$i")

(mv "$ i" "crypto- $ i")
mv: not stat '$ i': нет такого файла или каталога

И наконец, я подумал, что, поскольку я использовал % для ссылки на i в первый раз, я долженпозже снова используйте % и попытайтесь:

for %i in (*.png) do (mv "%i" "crypto-%i")

Этот вариант сработал, и все файлы были успешно переименованы.


Мой вопрос: почему сработала последняя команда идругие не сделали?Почему существует так много разных синтаксисов, которые работают только в определенных случаях?Каковы эти случаи?Почему вы ставите скобки иногда, а иногда нет?Почему вы ставите точки с запятой, а иногда нет?В чем разница между $i, %i и %%i?

1 Ответ

1 голос
/ 25 апреля 2019

Синтаксис основан на том, какую оболочку вы используете.Так как у cmder есть bash, я использовал bash.Вместо этого это был cmd.

Кроме того, программы, которые вы можете запускать в CLI, не определяются типом используемой оболочки.Вы можете запускать ls, mv и все другие программы "bash" , если они установлены.

Я думал, что вы можете запускать "программы Windows" в CMD и "Программы Unix "в Bash.Я думал, что оболочки связаны вместе с программами, для которых они чаще всего используются.Это не так.

Итак, чтобы ответить на вопрос:

i и $i - это синтаксис для bash :

for i in *; do echo $i; done

Согласно этот ответ , %i - это синтаксис для cmd :

for /l %x in (1, 1, 100) do echo %x

... в то время как %%i - это синтаксис для команд вкомандный файл:

for /l %%x in (1, 1, 100) do echo %%x

Sidenote: «shell» не является интерпретатором командной строки.Это слово для интерпретатора командной строки.Bash и CMD являются оболочками.

Итак, чтобы уточнить:

  • оболочка является пользователеминтерфейс для доступа к сервисам операционной системы.Это может быть интерфейс командной строки (CLI) или графический интерфейс пользователя (GUI).Оболочки CLI (bash, cmd) позволяют вам взаимодействовать с вашим компьютером с помощью команд.Оболочки графического интерфейса пользователя (например, File Explorer в Windows, Finder в macOS) позволяют вам взаимодействовать с вашим компьютером с помощью мыши и других периферийных устройств.

  • cmder - это консольный эмулятор, который поставляется с такими инструментами (программами) Unix, как ls, mv и т. Д. Он запускает оболочку CLI и может запускать поставляемые с ней инструменты Unix.

  • bash - это оболочка CLI, созданная для проекта GNU.

  • cmd - это оболочка CLI, созданная для Windows.

  • cmder может эмулировать bash, cmd или PowerShell, которые являются оболочками.

...