Как расширить команду, хранящуюся в переменной sh, с параметрами? - PullRequest
0 голосов
/ 03 марта 2020

Я пытался погуглить проблему и поиграть с разными подходами, но мне не удалось выполнить команду: / Я хочу составить команду из набора условных проверок. Вот чего я хочу достичь:

run_script=`command`

if type command &>/dev/null; then
    run_script=`command`
else
    run_script=`something command`
fi

# while ... do
    $params=`-a -b -c` # calculated
    $anotherparam = "./test.file" # calculated

    # run $run_script+$params+$anotherparam ???
    # like we run "command -a -b -c ./test.file" command
# done

Примечание: это всего лишь пример

Как я могу сделать этот тип комбинации? Я могу использовать массивы, потому что мне нужно, чтобы он был совместим с sh

Ответы [ 3 ]

3 голосов
/ 03 марта 2020

Правильный POSIX sh способ динамического построения командного вызова с параметрами:

#!/bin/sh

run_script='command'

if command -v "$run_script" >/dev/null 2>&1; then
    set -- "$run_script"
else
    set -- "something" "$run_script"
fi

# while ... do
#    $params=`-a -b -c` # calculated
    set -- "$@" -a -b -c # calculated
#    $anotherparam = "./test.file" # calculated
    set -- "$@" "./test.file" # calculated
    # run $run_script+$params+$anotherparam ???
    "$@" # run command with its parameters
    # like we run "command -a -b -c ./test.file" command
# done

Пояснения:

  • if command -v "$run_script" >/dev/null 2>&1: Проверяет, существует ли команда "$run_script" .
  • set -- "$run_script": устанавливает массив аргументов для команды "$run_script".
  • set -- "something" "$run_script": устанавливает массив аргументов для команды something с первым аргументом "$run_script".
  • set -- "$@" -a -b -c: Устанавливает массив аргументов с "$@" текущим содержимым массива аргументов и -a, -b и -c в качестве дополнительных аргументов.
  • Автономный "$@": вызывает команду и аргументы, содержащиеся в массиве arguments.
1 голос
/ 03 марта 2020

Вы можете использовать:

if type -p command; then
    run_script="command"
else
    run_script="something command"
fi

params="-a -b -c"
anotherparam="./test.file"

"$run_script" $params $anotherparam

Изменения в коде операции:

  • использовать type -p cmd вместо type cmd &>/dev/null
  • использовать кавычки вместо обратных галочек для run_script="command"
  • удалить пробелы вокруг знака равенства =
  • удалить $ с левой стороны знака равенства
0 голосов
/ 03 марта 2020

Это вызовет сильные мнения.

Если вы абсолютно уверены, что получите только надежные, не злонамеренные данные, eval является частью стандартной оболочки и идеальным инструментом для этого. task.

См .: https://unix.stackexchange.com/questions/278427/why-and-when-should-eval-use-be-avoided-in-shell-scripts

Аргументы объединяются в одну команду, которая затем читается и выполняется, и ее статус выхода возвращается как статус выхода eval. Если нет аргументов или только пустые аргументы, возвращаемый статус равен нулю.

if type command &>/dev/null; then
    run_script="command"
else
    run_script="something command"
fi

params="-a -b -c" # calculated
anotherparam="./test.file" # calculated

eval "$run_script $params $anotherparam"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...