Предотвращение многократного расширения параметров

Хотя / (U + 002F) является разделителем компонентов пути и, очевидно, не может использоваться в именах файлов, существует несколько ( например, даже один комбинированный ( ̸ )), которые выглядят очень похожими и что вы могли бы использовать вместо этого, если намерение состоит в том, чтобы сбить с толку или обмануть людей, использующих систему.

Например:

mkdir A3456⁄90876⁄IN

Теперь, если вы просто хотите создать каталог IN внутри каталога 90876 внутри каталога A3456 с помощью одной единственной команды , то это просто:

mkdir -p A3456/90876/IN
2
10.02.2018, 16:57
1 ответ

Рассмотрим следующий пример скрипта (все отступы являются буквальными вкладками):

#!/bin/sh

var='hello'

cat >script1.sh <<-END_SCRIPT1
        #!/bin/sh
        echo 'This is script1 ($var)'
        printf '\$0 is "%s"\n' "\$0"

        cat >script2.sh <<END_SCRIPT2
                #!/bin/sh
                echo 'This is script2 ($var)'
                printf '\\\$0 is "%s"\n' "\\\$0"
        END_SCRIPT2
END_SCRIPT1

Во внешнем здесь -документе нам нужно экранировать $в "$0"как "\$0", чтобы он не расширялся сценарием, записывающим документ.

Чтобы иметь возможность записать внутренний здесь -документ, мы должны убедиться, что внешний здесь -документ пишет "\$0". Обратная косая черта должна быть экранирована как \\, что превращает строку в "\\\$0".

Сценарий выше записывает script1.shкак

#!/bin/sh
echo 'This is script2 (hello)'
printf '\$0 is "%s"\n' "\$0"
END_SCRIPT2
printf '$0 is "%s"\n' "$0"

Запуск этих выходов

This is script1 (hello)
$0 is "script1.sh"

... и script2.shсоздается:

#!/bin/sh
echo 'This is script2 (hello)'
printf '$0 is "%s"\n' "$0"

Обратите внимание, что внутренний здесь -документ создан с использованием <<END_SCRIPT2, а не <<-END_SCRIPT2. Любые начальные вкладки будут съедены, когда будет создан внешний здесь -документ (, как видно изscript1.sh).


Кроме того, вам не нужны два вызова waitв вашем коде, так как вы не запускаете никаких фоновых процессов.

Ваш код awkтакже неверен, так как условие f && /testphrase2/никогда не будет истинным. Если /testphrase/совпадает, то выполняется next, заставляя код продолжаться со следующей строки ввода. Если /testphrase/не соответствует, то и /testphrase2/не будет соответствовать.

Вместо этого вы можете попробовать:

awk '!f && /testphrase/  { f = 1; r = "" }
     f  && /testphrase2/ { f = 0 }
     f                   { r = (r == "" ? $0 : r RS $0) }
     END                 { print r }'
0
27.01.2020, 22:18

Теги

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