Как избежать разбиения строкового параметра на несколько параметров? - PullRequest
0 голосов
/ 24 ноября 2018

Я хочу передать строковый параметр в процедуру Bash.Эта процедура печатает строку на консоли и печатает копию в файл.

В моем случае этот файл будет содержать список всех выполненных команд в скрипте Bash, которые можно использовать для повторного выполнения всех инструкций втот же порядок.Это необходимо, если возникает ошибка, и мне нужно отправить скрипт размножитель в открытый исходный проект на GitHub.Он также скопирует все используемые файлы в каталог для последующего создания ZIP-файла.

Итак, давайте поговорим о коде Bash:

#! /bin/bash
open() {
    local File=$1
    exec 3<> "$File"
}

close() {
    exec 3>&-
}

procedure1() {
    echo "$1"
    echo "echo \"$1\"" >&3
}

procedure2() {
    echo "$1" "$2"
    echo "echo \"$1\" \"$2\"" >&3
}

procedure3() {
    echo "$@"
    echo "echo \"$@\"" >&3
}

# ==============================================================================
OUTPUT_FILE="output.sh"

Program_A="foo"
Paramater_A=(
    --spam
    --egg=4
)

Program_B="bar"
Paramater_B=(
    --ham
    --spice=4
)

open $OUTPUT_FILE

echo "$Program_A -a ${Paramater_A[@]}"
echo "$Program_B -b ${Paramater_B[@]}"
echo
procedure1 "$Program_A -a ${Paramater_A[@]}" "$Program_B -b ${Paramater_B[@]}"
procedure2 "$Program_A -a ${Paramater_A[@]}" "$Program_B -b ${Paramater_B[@]}"
procedure3 "$Program_A -a ${Paramater_A[@]}" "$Program_B -b ${Paramater_B[@]}"

close

echo
echo -e "\e[33m========================================\e[0m"
echo -e "\e[33mReading output file from disk\e[0m"
echo -e "\e[33m========================================\e[0m"
echo
cat $OUTPUT_FILE

Вывод на консоль такой:

$ ./test.sh
foo -a --spam --egg=4
bar -b --ham --spice=4

foo -a --spam
foo -a --spam --egg=4
foo -a --spam --egg=4 bar -b --ham --spice=4

========================================
Reading output file from disk
========================================

echo "foo -a --spam"
echo "foo -a --spam" "--egg=4"
echo "foo -a --spam --egg=4 bar -b --ham --spice=4"

Итак, я вижу, что ".... ${Parameter_A[@]} ..." содержится в строке, но разбивает строку на несколько строк.Вот почему $1 в процедуре содержит строку, включающую первое значение параметра.

Как встроить все параметры в одну строку, не разбивая ее на несколько строк?

$@ работаетраспечатать все тексты, потому что он содержит все параметры, переданные в процедуру.Однако это не решение для меня, потому что я не могу отличить, когда начинается строка с $2 или другими словами, сколько частей принадлежит $1.

1 Ответ

0 голосов
/ 24 ноября 2018

В соответствии с предложением Сайрус , я использовал shellcheck.net для проверки моего скрипта Bash.

Вот результат проверки:

$ shellcheck myscript

Line 24:
    echo "echo \"$@\"" >&3
                 ^-- SC2145: Argument mixes string and array. Use * or separate argument.

Line 33:
    --egg=4
    ^-- SC2191: The = here is literal. To assign by index, use ( [index]=value ) with no spaces. To keep as literal, quote it.

Line 39:
    --spice=4
    ^-- SC2191: The = here is literal. To assign by index, use ( [index]=value ) with no spaces. To keep as literal, quote it.

Line 44:
echo "$Program_A -a ${Paramater_A[@]}"
                    ^-- SC2145: Argument mixes string and array. Use * or separate argument.

Line 45:
echo "$Program_B -b ${Paramater_B[@]}"
                    ^-- SC2145: Argument mixes string and array. Use * or separate argument.

Line 47:
procedure1 "$Program_A -a ${Paramater_A[@]}" "$Program_B -b ${Paramater_B[@]}"
                          ^-- SC2145: Argument mixes string and array. Use * or separate argument.
>>                                                          ^-- SC2145: Argument mixes string and array. Use * or separate argument.

Line 48:
procedure2 "$Program_A -a ${Paramater_A[@]}" "$Program_B -b ${Paramater_B[@]}"
                          ^-- SC2145: Argument mixes string and array. Use * or separate argument.
>>                                                          ^-- SC2145: Argument mixes string and array. Use * or separate argument.

Line 49:
procedure3 "$Program_A -a ${Paramater_A[@]}" "$Program_B -b ${Paramater_B[@]}"
                          ^-- SC2145: Argument mixes string and array. Use * or separate argument.
>>                                                          ^-- SC2145: Argument mixes string and array. Use * or separate argument.

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

...