Escape a variable for use as content of another script

Еще одно решение, которое, как мне кажется, заключается в автопереходе , а z - это fasd .

Он отслеживает, какие каталоги вы посещаете, и z dir-name перейдет в каталог с именем dir-name , который вы используете чаще всего. Он также имеет некоторые функции для часто используемых файлов.

Вы можете клонировать его со страницы: https://github.com/clvv/fasd

Установка выполняется просто, клонируйте, выполните установку, а затем измените свой . bashrc (или .zshrc и т. д.).

19
01.08.2018, 08:27
4 ответа

Наверное, я не RTFM. Это можно сделать так:

q_mid=\'\\\'\'
foo_esc="'${foo//\'/$q_mid}'"

Тогда echo "$foo_esc"дает ожидаемое'bar'\''baz'


Как я на самом деле использую это с функцией:

function esc_var {
    local mid_q=\'\\\'\'
    printf '%s' "'${1//\'/$mid_q}'"
}

...

foo_esc="`esc_var "$foo"`"

Изменение этого для использования printf, встроенного -из решения Дежа:

function esc_vars {
    printf ' %q' "$@" | cut -b 2-
}

Принимая во внимание предупреждения Стефана о несовместимости между различными версиями bash относительно одинарных кавычек внутри расширений с двойными -кавычками, функция доказательства маркера -становится:

esc_vars() {
    local fmt
    fmt='%s'
    local v
    while [ $# -gt 0 ]; do
        v=\'${1//\'/\'\\\'\'}\'
        printf "$fmt" "$v"
        fmt=' %s'
        shift
    done
}
9
27.01.2020, 19:44

Bash предоставляет встроенную printfспецификацию формата %q, которая выполняет экранирование оболочки даже в более старых (<4.0 )версиях Bash:

printf '[%q]\n' "Ne'er do well"
# Prints [Ne\'er\ do\ well]

printf '[%q]\n' 'Sneaky injection $( whoami ) `ls /root`'
# Prints [Sneaky\ injection\ \$\(\ whoami\ \)\ \`ls\ /root\`]

Этот трюк также можно использовать для возврата массивов данных из функции:

function getData()
{
  printf '%q ' "He'll say hi" 'or `whoami`' 'and then $( byebye )'
}

declare -a DATA="( $( getData ) )"
printf 'DATA: [%q]\n' "${DATA[@]}"
# Prints:
# DATA: [He\'ll\ say\ hi]
# DATA: [or\ \`whoami\`]
# DATA: [and\ then\ \$\(\ byebye\ \)]

Обратите внимание, что встроенная программа Bash printfотличается от утилиты printf, которая поставляется в комплекте с большинством Unix -подобных операционных систем. Если по какой-то причине команда printfвызывает утилиту вместо встроенной, вы всегда можете вместо нее выполнить builtin printf.

20
27.01.2020, 19:44

Существует несколько решений для цитирования значения переменной:

  1. псевдоним
    В большинстве оболочек (, где доступен псевдоним )(, за исключением csh, tcsh и, возможно, других подобных csh):

    $ alias qux=bar\'baz
    $ alias qux
    qux='bar'\''baz'
    

    Да, это работает во многихsh-таких оболочках, как dash или ash.

  2. установить
    Также в большинстве оболочек снова (, а не csh):

    $ qux=bar\'baz
    $ set | grep '^qux='
    qux='bar'\''baz'
    
  3. набрано
    В некоторых оболочках (ksh, bash и zsh по крайней мере):

    $ qux=bar\'baz
    $ typeset -p qux
    typeset qux='bar'\''baz'             # this is zsh, quoting style may
                                         # be different for other shells.
    
  4. экспорт
    Сначала сделай:

    export qux=bar\'baz
    

    Затем используйте:
    export -p | grep 'qux='export -p | grep 'qux='
    export -p qux

  5. цитата
    echo "${qux@Q}"
    echo "${(qq)qux}"#можно использовать от одного до четырех q.

6
27.01.2020, 19:44

В PHP вы можете использовать функцию escapeshellarg , которая преобразует общую строку в строку аргумента bash.

-2
24.07.2020, 15:27

Теги

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