Я хочу передать строковый параметр в процедуру 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
.