Сценарии HP-UX KSH - передача пустых параметров с помощью $ @ - PullRequest
0 голосов
/ 31 мая 2018

У меня «проблема» со сценарием, который я разрабатываю в HP-UX KSH.Скрипт содержит много функций, и мне нужно передать один и тот же набор параметров между ними.Все хорошо, но некоторые параметры могут быть пустыми.Легко передавать пустые параметры, используя двойные двойные кавычки (""), но что, если я хочу передать полный набор параметров из одной функции в другую, используя $ {@}, включая пробелы?И чтобы усложнить задачу, каждый раз может быть переменное количество параметров, поэтому метод должен быть динамическим.

Пример: у меня есть функция с именем test1, которая принимает несколько параметров.Любой из них может быть пустым.Я также создал функцию с именем test2, в которую передаются все параметры test1:

test1()
{
  echo 1-1: ${1}
  echo 1-2: ${2}

  test2 ${@}
}

test2()
{
  echo 2-1: ${1}
  echo 2-2: ${2}
}

# test1 "" hello

1-1:
1-2: hello
2-1: hello
2-2:

Проблема в том, что если $ {1} пусто, $ {2} из test1 выглядит как $ {1} в test2.Поэтому, чтобы обойти проблему, я создал этот код, который эффективно создает строку функции со всеми параметрами, заключенными в двойные кавычки:

test1()
{
  typeset var FUNC="test2"
  typeset -i var COUNT=1

  echo 1-1: ${1}
  echo 1-2: ${2}

  while [ ${COUNT} -le ${#@} ]; do
    typeset var PARAM=$(eval "echo \$${COUNT}")
    FUNC="${FUNC} \"${PARAM}\""
    ((COUNT=COUNT+1))
  done

  eval "${FUNC}"
}

# test1 "" hello

1-1:
1-2: hello
2-1: 
2-2: hello

Это работает очень хорошо, спасибо.Теперь к моей «проблеме».

Возможно ли на самом деле инкапсулировать вышеуказанный код в свою собственную функцию?Мне кажется уловка 22 в том, что вы должны запустить этот код, чтобы передать пустые параметры.Я должен повторить этот фрагмент кода много раз в моем сценарии, потому что я не могу найти другой путь.Есть ли один?

Любая помощь или руководство будет с благодарностью получено.

1 Ответ

0 голосов
/ 01 июня 2018

Вот как я бы написал ваши функции:

show_params() {
    typeset funcname=$1
    typeset -i n=0
    shift
    for arg; do 
        ((n++))
        printf "%s:%d >%s<\n" "$funcname" $n "$arg"
    done
}
test1() { show_params "${.sh.fun}" "$@"; test2 "$@"; }
test2() { show_params "${.sh.fun}" "$@"; }

test1 "" 'a string "with double quotes" in it'
test1:1 ><
test1:2 >a string "with double quotes" in it<
test2:1 ><
test2:2 >a string "with double quotes" in it<

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

$ test1 "" 'a string "with double quotes" in it'
1-1:
1-2: a string "with double quotes" in it
test2:1 ><
test2:2 >a string with<
test2:3 >double<
test2:4 >quotes in it<

Это потому, что вы делаете это:

eval "test2 \"\" \"a string \"with double quotes\" in it\""
# ......... A A  A          B                   B       A
# A = injected quotes
# B = pre-existing quotes contained in the parameter
...