summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--functions/interpreter/vyatta-op-run43
1 files changed, 41 insertions, 2 deletions
diff --git a/functions/interpreter/vyatta-op-run b/functions/interpreter/vyatta-op-run
index 1d460ee..bc01dd2 100644
--- a/functions/interpreter/vyatta-op-run
+++ b/functions/interpreter/vyatta-op-run
@@ -103,11 +103,50 @@ _vyatta_op_conv_run_cmd ()
{
# Substitue bash positional variables
# for the same value in the expanded array
+ local restore_shopts=$( shopt -p extglob nullglob | tr \\n \; )
+ shopt -s extglob
+ shopt -u nullglob
local run_cmd
- run_cmd="$@"
+ run_cmd=$1
run_cmd="${run_cmd/\"\$\@\"/${args[*]}}"
run_cmd="${run_cmd/\$\*/${args[*]}}"
- run_cmd=$(echo -e "$run_cmd" | sed -e 's/\$\([0-9]\)/\$\{args\[\1\]\}/g')
+ inquote=0;
+ outcmd='';
+ OIFS=$IFS
+ IFS=$'\n'
+ regex="'[^']+'"
+ for line in ${run_cmd[@]}; do
+ outline=''
+ if [[ "$line" =~ $regex ]]; then
+ IFS=$OIFS
+ for word in $line; do
+ if [[ $word =~ "'" ]]; then
+ if [[ $inquote == 0 ]]; then
+ inquote=1
+ else
+ inquote=0
+ outline+="$word "
+ continue
+ fi
+ fi
+ if [[ $inquote == 0 ]] &&
+ [[ "$word" =~ \$[0-9] ]]; then
+ word=$( sed -e 's/\$\([0-9]\)/\$\{args\[\1\]\}/g' <<<"$word" )
+ fi
+ outline+="$word "
+ done
+ IFS=$'\n'
+ line=$outline
+ else
+ if [[ "$line" =~ \$[0-9] ]]; then
+ line=$( sed -e 's/\$\([0-9]\)/\$\{args\[\1\]\}/g' <<<"$line" )
+ fi
+ fi
+ outcmd+="$line\n"
+ done
+ run_cmd=$outcmd
+ IFS=$OIFS
+ eval "$restore_shopts"
echo -ne "$run_cmd"
}