printf aplica sua string de formato a cada argumento que a segue na saída. É um bash shell embutido e pode ser usado para aplicar uma string delimitadora a uma lista de argumentos - tipo de.
Por exemplo:
printf %s:delimit: arg1 arg2 arg3
arg1:delimit:arg2:delimit:arg3:delimit:
A coisa é, printf não para aplicar sua string de formato no final de seus argumentos, e o último recebe um delimitador anexado. Isso pode ser tratado em alguns casos:
printf %b:delimit: \0150 \0145 \0171\c
h:delimit:e:delimit:y
printf interpreta C e octal escapa como %b ytes com um determinado tipo de formato, e também com o formato %b you \c ut sua saída em um determinado ponto, e é por isso que printf faz não siga o y acima com uma string :delimit: , como a string de formatação indicaria.
Então, se você quiser que todo argumento literalmente interpretado e não seja um delimitador final, então você terá que resolver o problema dentro da própria lista de argumentos:
set -- arg1 arg2 arg3
for arg do shift
set -- "$@" :delimit: "$arg"
done; shift
printf %s "$@"
arg1:delimit:arg2:delimit:arg3