Автор оригинала: David Wong.
Передайте данные, аналогичные формату “массив”, в скрипт оболочки на PHP:
Смоделированный Сценарий 1
Рассчитайте цену комплектного товара. Упакованный товар содержит много товаров. Этот товар является неопределенным. Мы временно определяем его как яблоко, каштан и банан. Цена составляет 8 юаней/кг, 10 юаней/кг и 3 юаня/кг соответственно. Спецификация веса составляет 500 г. Мы передаем цену в качестве параметра в сценарий оболочки для расчета общей цены. Ниже приведен код для раздела PHP:
$prices = array(
"apple" => 8,
"banana" => 3,
"chestnut" => 10
);
$command = "bash ".ROOT_PATH."/script/test.sh ";
foreach ($prices as $price) {
$command .= $price." ";
}
$output = array();
$ret = 1;
exec($command." 2>&1", $output, $ret);
var_dump($command, $output, $ret);exit;
// The command command is:
// bash /data/home/tina/script/test.sh 8 3 10Следующее касается test.sh сценарий:
#!/bin/bash all=0 for price in [email protected] do all=`expr ${all} + ${price}` done echo ${all}
Смоделированный Сценарий 2
В сценарии 1 мы изменяем цену как с плавающей запятой. Цена яблока, каштана и банана составляет 8,8 юаня/кг, 9,9 юаня/кг и 3,5 юаня/кг соответственно. Выражение Expr приведет к ошибке (expr: ошибка номера параметра). Expr не поддерживает тип с плавающей запятой. Здесь следует использовать BC или awk. Сценарий оболочки должен быть изменен следующим образом:
#!/bin/bash all=0 for price in [email protected] do #all=$(echo ${price}+${all}|bc) all=$(awk "BEGIN{print ${all}+${price}}") done echo ${all}
Имитация Сцены 3
Исходя из сценария 2, упакованные товары теперь должны изменить свой вес. Яблоко 0,5 КГ, банан 1 КГ, каштан 1,5 КГ. При расчете цены нам также необходимо передать параметры веса в скрипт оболочки для расчета цены. Решение 1. Продолжайте добавлять эти параметры в сценарий и разделите количество параметров на две части. Мы знаем, что первая половина-это параметр цены, а вторая половина-параметр веса. Измените его следующим образом: Раздел кода PHP:
$prices = array(
"apple" => 8.8,
"banana" => 3.5,
"chestnut" => 9.9
);
$weights = array(
"apple" => 1,
"banana" => 2,
"chestnut" => 3
);
$command = "bash ".ROOT_PATH."/script/test.sh ";
foreach ($prices as $price) {
$command .= $price." ";
}
foreach ($weights as $weight) {
$command .= $weight." ";
}
$output = array();
$ret = 1;
exec($command." 2>&1", $output, $ret);
var_dump($command, $output, $ret);exit;
// The command command is:
// bash /data/home/tina/script/test.sh 8.8 3.5 9.9 1 2 3Измененный сценарий оболочки является:
#!/bin/bash
all=0
count=`expr ${#} / 2`
countIndex=`expr ${count} + 1`
for price in ${@:1:${count}}
do
#all=$(echo "${price}*${!countIndex}+${all}"|bc)
all=$(awk "BEGIN{print ${all}+${price}*${!countIndex}}")
countIndex=`expr ${countIndex} + 1`
done
echo ${all}Решение 2. Группировка двух видов данных аналогична массиву PHP, поэтому каждую группу параметров необходимо заключить в одинарные кавычки в команде, чтобы оболочка думала, что есть только два параметра, а затем обрабатывалась как массив в сценарии оболочки. Измените следующим образом: раздел PHP:
$prices = array(
"apple" => 8.8,
"banana" => 3.5,
"chestnut" => 9.9
);
$weights = array(
"apple" => 1,
"banana" => 2,
"chestnut" => 3
);
$command = bash. ROOT_PATH. "/script/test.sh'";//Add single quotation marks
foreach ($prices as $price) {
$command .= $price." ";
}
$command = trim ($command). "''";// Add single quotation marks
foreach ($weights as $weight) {
$command .= $weight." ";
}
$command = trim ($command). "'";// Add single quotation marks
$output = array();
$ret = 1;
exec($command." 2>&1", $output, $ret);
var_dump($command, $output, $ret);exit;
// The command command is:
// bash /data/home/tina/script/test.sh '8.8 3.5 9.9' '1 2 3'Сценарий оболочки был изменен на:
#!/bin/bash
all=0
index=0
prices=()
weights=()
for price in ${prices[@]}
do
all=$(awk "BEGIN{ print ${price}*${weights[${index}]}+${all} }")
index=`expr ${index} + 1`
done
echo $allПо сравнению со схемой 1 и схемой 2, в долгосрочной перспективе, я думаю, что схема 2 более выгодна и ее легко отличить: мы можем четко знать, что первый параметр-это ценовая группа, второй параметр-весовая группа, которую можно расширить: например, нам нужно добавить параметр ставки дисконтирования (ставка дисконтирования составляет 0,9, 0,88, 0,95), купоны. Цена снижена на 5 юаней и т.д. Для первой схемы значение счетчика не является фиксированным. Если ставка дисконтирования рассчитывается, предполагая, что каждый вид фруктов имеет отдельную ставку дисконтирования, количество все равно кратно 3. Можно разделить 2 на 3.
# The command command is: bash /data/home/tina/script/test.sh 8.8 3.5 9.9 1 2 3 0.9 0.88 0.95
Но для купона это должна быть общая скидка на товары в комплекте, которая является отдельным параметром, при условии, что купон составляет 5 юаней, продолжайте добавлять параметры.
# The command command is: bash /data/home/tina/script/test.sh 8.8 3.5 9.9 1 2 3 0.9 0.88 0.95 5
На этот раз также не удалось хорошо различить ряд цифр, что не выгодно для последующего обслуживания, человек, который берет на себя управление, должен быть лицом, которое нужно принудить, это все, какой параметр, затем сердце начинает Тукао, план может придумать способ изменить count= (параметр -1)/3, но если позже возникнут другие потребности, эта логика также хочет иметь логику. Модификация очень утомительна. Для схемы 2 нет необходимости изменять предыдущую логику. Нужно только добавить. Без изменения предыдущей логики сценарий написан не будет. Это всего лишь каштан.
На самом деле, из-за необходимости работы я столкнулся с написанием сценариев оболочки. Впервые я увидел растерянное лицо. Эта сцена также моделируется. На самом деле, необходимо иметь дело с большим количеством больших файлов, а затем просматривать их во время обучения и обнаруживать, что эти команды супер… Как бы это выразиться? Это похоже на открытие нового континента, мощного…
Запишите первый написанный сценарий оболочки, ну, это эммммм… Сценарий не является отказоустойчивым.
Добавьте несколько простых команд, которые вы выучили, и не забывайте, что ___________. 1 dos2unix Преобразуйте ключи новой строки в файлах Windows в ключи новой строки в Unix (вы можете использовать редактор Notepad++, чтобы увидеть, что в Windows символы новой строки-CR LF, а в unix-LF) 2 сортировка Сортировка файлов в соответствии с указанными правилами 3 связь Два заказ Сравнивая файлы, вы можете получить набор различий и пересечение (мощный, тогда два файла должны быть упорядочены, иначе они будут сообщать об ошибках, то есть файлы отсортированы по последней команде сортировки) 4 туалет Номер Строки Статистического Файла (Фактически Статистический Разрыв Строки) 5 [электронная почта защищена] Все параметры скрипта 6 $# Количество параметров скрипта 7 ${@:1:4} Параметры эталонного сценария варьируются от 1 до 4 (необязательно)
Оригинал: “https://developpaper.com/php-passes-array-format-parameters-to-shell-scripts/”