Предположим, что у меня есть #!/bin/sh
script, который может принимать различные позиционные параметры, некоторые из которых могут включать пробелы либо/оба типа кавычек, и т.д. Я хочу повторить итерацию "[email protected]"
, и для каждого аргумента немедленно обработать его или сохранить его позже. В конце script я хочу запустить (возможно, exec
) другой процесс, передав некоторые из этих параметров со всеми специальными символами.
Если бы я не обрабатывал параметры, othercmd "[email protected]"
работал бы отлично, но мне нужно немного вытащить некоторые параметры и обработать их.
Если бы я мог предположить Bash, то я мог бы использовать printf %q
для вычисления цитированных версий args, которые я мог бы eval
позже, но это не сработало бы, например. Ubuntu Dash (/bin/sh
).
Существует ли какой-либо эквивалент printf %q
, который может быть написан в простой оболочке Bourne script, используя только встроенные и POSIX-определенные утилиты, например, как функцию, которую я мог бы скопировать в script?
Например, script пытается ls
аргументы в обратном порядке:
#!/bin/sh
args=
for arg in "[email protected]"
do
args="'$arg' $args"
done
eval "ls $args"
работает во многих случаях:
$ ./handle goodbye "cruel world"
ls: cannot access cruel world: No such file or directory
ls: cannot access goodbye: No such file or directory
но не тогда, когда используется '
:
$ ./handle goodbye "cruel'st world"
./handle: 1: eval: Syntax error: Unterminated quoted string
и следующее работает нормально, но полагается на Bash:
#!/bin/bash
args=
for arg in "[email protected]"
do
printf -v argq '%q' "$arg"
args="$argq $args"
done
eval "ls $args"