From c83583b1f07a28ac99172bbf158d3ba599dc7af5 Mon Sep 17 00:00:00 2001 From: John Southworth Date: Mon, 13 Feb 2012 18:53:57 -0800 Subject: Bugfix 7774: fix quoted string variable expression --- functions/interpreter/vyatta-op-run | 43 +++++++++++++++++++++++++++++++++++-- 1 file 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" } -- cgit v1.2.3