Это какое-то регулярное выражение в экземпляре переменной bash? - PullRequest
0 голосов
/ 07 сентября 2018

Что делают эти два назначения (i и C опускают первое, чтобы аннулировать)? Это какое-то регулярное выражение для переменной? Я пытался с bash, но до сих пор не было никаких изменений в выводе моих строк после создания экземпляра их с помощью "${i//\\/\\\\}" или "\"${i//\"/\\\"}\""

C=''
for i in "$@"; do
    i="${i//\\/\\\\}"
    C="$C \"${i//\"/\\\"}\""
done

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

${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
0 голосов
/ 07 сентября 2018

Это bash Расширения параметров

  • он заменяет все обратные косые черты на двойные: "${i//\\/\\\\}
  • заменить все \" by \\": ${i//\"/\\\"}

Проверка http://wiki.bash -hackers.org / syntax / pe

...