${i//\\/\\\\}
- немного сложное расширение параметра:
Расширяет переменную $i
следующим образом:
${i//find/replace}
означает заменить все экземпляры "find" на "replace". В этом случае нужно найти \
, который сам должен убежать с другим \
.
- Замена - это два
\
, каждый из которых должен убежать.
Например:
$ i='a\b\c'
$ echo "${i//\\/\\\\}"
a\\b\\c
Следующая строка выполняет расширение другого параметра:
- find
"
(который должен быть экранирован, поскольку он находится внутри строки в двойных кавычках)
- заменить на
\"
(и двойная кавычка, и обратная косая черта должны быть экранированы).
Похоже, что целью цикла является создание строки C
, пытающейся безопасно процитировать / экранировать аргументы, переданные в сценарий. Этот тип подхода обычно подвержен ошибкам, и, вероятно, было бы лучше работать с входным массивом напрямую. Например, аргументы, переданные в сценарий, могут быть безопасно переданы другой команде, например:
cmd "$@" # does "the right thing" (quotes each argument correctly)
если вам действительно нужно избежать обратной косой черты, вы можете сделать это тоже:
cmd "${@//\\/\\\\}" # replaces all \ with \\ in each argument