Как хранить и печатать переменные со специальными символами в shell/bash/sh/

Сzsh:

zmodload zsh/files
rand() REPLY=$RANDOM
autoload zargs zmv

files=(*.ext)

# shuffle the list by using our custom "rand" order function
new_files=(*.ext(o+rand))

# append a ".new" suffix
new_files=($^new_files.new)

# rename files
zargs -l2 -- ${files:^new_files} -- mv --

# remove the.new extension once all the files are renamed
zmv '(*.ext).new' '$1'

Та же идея, что и у @ilkkachu, но не делается предположений о том, какие символы могут содержать имена файлов, и не требуется никаких внешних утилит (zsh/filesсодержит встроенную mvкоманду ).

0
20.06.2020, 23:33
2 ответа

Если ваша оболочка POSIXсовместима (, в случае, если printfявляется встроенной командой )или вызывает совместимую printf, просто попробуйте:

printf -- "$var"

Это указывает printfне интерпретировать следующий аргумент как опцию.

В целом, однако, имейте в виду, что процент или обратная косая черта в содержании $varмогут привести к тому, что ваш вывод будет изменен так, как вы не ожидаете. По этой причине

printf "%s" "$var"

— лучшее решение.

0
18.03.2021, 23:26

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

$ gdbParameters="-ex 'set pagination off' -ex 'set environment G_MESSAGES_DEBUG = all'"
$ printf '%s\n' "$gdbParameters"
-ex 'set pagination off' -ex 'set environment G_MESSAGES_DEBUG = all'

Что касается сохранения переменной способом, который никогда не будет мешать любому коду, который попытается ее использовать, то это невозможно. Вместо этого вам нужно позаботиться и всегда писать хороший, чистый код, который может работать с произвольным содержимым в переменной.

Вот основные рекомендации, такие как всегда заключать переменные в кавычки (см. Почему мой сценарий оболочки забивается пробелами или другими специальными символами? и Последствия для безопасности, если забыли заключить переменную в кавычки в оболочках bash/POSIX)и использовали стандарт --для обозначения конца параметров всякий раз, когда вы вызываете программу и передаете ей переменную в качестве входных данных (e.g. grep -- "$variable" file). ].

4
18.03.2021, 23:26

Теги

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