PHP传递数组格式参数到shell脚本中-php教程

资源魔 28 0

PHP中通报相似于“数组”格局数据到shell剧本中:

模仿场景1

较量争论绑缚商品的价钱,绑缚商品中蕴含多个商品,这个商品是没有确定的,咱们临时界说为苹果、栗子、香蕉,价钱辨别为8元/斤、10元/斤、3元/斤,分量规格定为500g,咱们把价钱当作参数通报给shell剧本较量争论总价钱
如下是对于PHP局部的代码:

$prices = array(
    "apple"    => 8,
    "banana"   => 3,
    "chestnut" => 10
);

$co妹妹and = "bash ".ROOT_PATH."/script/test.sh ";
foreach ($prices as $price) {
    $co妹妹and .= $price." ";
}
$output = array();
$ret = 1;
exec($co妹妹and." 2>&1", $output, $ret);
var_dump($co妹妹and, $output, $ret);exit;
// co妹妹and饬令为:
// bash /data/home/tina/script/test.sh 8 3 10

上面是对于test.sh剧本内容:

#!/bin/bash

all=0
for price in $@
do
    all=`expr ${all} + ${price}`
done
echo ${all}

模仿场景2

正在场景1的状况下,咱们修正价钱为浮点数,苹果、栗子、香蕉价钱辨别为8.8元/斤、9.9元/斤、3.5元/斤,expr表白式会报错(expr: 参数数量谬误),expr没有支持浮点类型,这里应该采纳bc或许awk,shell剧本修正以下:

#!/bin/bash

all=0
for price in $@
do
    #all=$(echo ${price}+${all}|bc)
    all=$(awk "BEGIN{print ${all}+${price}}")
done
echo ${all}

模仿场景3

正在场景2的根底上,绑缚商品如今需求变卦分量,苹果0.5KG、香蕉1KG、栗子1.5KG,则较量争论价钱时,咱们也需求把分量的参数通报到shell剧本中,能力较量争论价钱。
计划一:持续把这些参数加正在剧本之后,把参数个数一分为二,咱们晓得后面一半局部为价钱参数,后半段参数为分量参数,修正以下:
PHP代码局部:

$prices = array(
    "apple"    => 8.8,
    "banana"   => 3.5,
    "chestnut" => 9.9
);
$weights = array(
    "apple"    => 1,
    "banana"   => 2,
    "chestnut" => 3
);

$co妹妹and = "bash ".ROOT_PATH."/script/test.sh ";
foreach ($prices as $price) {
    $co妹妹and .= $price." ";
}
foreach ($weights as $weight) {
    $co妹妹and .= $weight." ";
}

$output = array();
$ret = 1;
exec($co妹妹and." 2>&1", $output, $ret);
var_dump($co妹妹and, $output, $ret);exit;
// co妹妹and饬令为:
// bash /data/home/tina/script/test.sh 8.8 3.5 9.9 1 2 3

修正的shell剧本为:

#!/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}

计划二:把这两种数据进行分组,就相似于PHP的数组同样,这样需求正在饬令中将每一组参数辨别用单引号包裹,这样shell则会以为只有两个参数,再正在shell剧本中当作数组来解决,修正以下:
PHP局部:

$prices = array(
    "apple"    => 8.8,
    "banana"   => 3.5,
    "chestnut" => 9.9
);
$weights = array(
    "apple"    => 1,
    "banana"   => 2,
    "chestnut" => 3
);

$co妹妹and = "bash ".ROOT_PATH."/script/test.sh '"; //增加单引号
foreach ($prices as $price) {
    $co妹妹and .= $price." ";
}
$co妹妹and = trim($co妹妹and) . "' '";  //增加单引号
foreach ($weights as $weight) {
    $co妹妹and .= $weight." ";
}
$co妹妹and = trim($co妹妹and) . "'";  //增加单引号
$output = array();
$ret = 1;
exec($co妹妹and." 2>&1", $output, $ret);
var_dump($co妹妹and, $output, $ret);exit;
// co妹妹and饬令为:
// bash /data/home/tina/script/test.sh '8.8 3.5 9.9' '1 2 3'

shell剧本修正为:

#!/bin/bash

all=0
index=0
prices=(${1})
weights=(${2})

for price in ${prices[@]}
do
    all=$(awk "BEGIN{ print ${price}*${weights[${index}]}+${all} }")
    index=`expr ${index} + 1`
done
echo $all

比照于计划一以及计划二,从久远看,集体以为仍是计划二占劣势一些,易于区别:能够显著晓得第一个参数是价钱组,第二个参数是分量组,可扩大:例如后续还要添加一个扣头率的参数(扣头率辨别为0.九、0.8八、0.95),优惠券减价5元等;
关于计划一,这个count的值是没有固定的,扣头率较量争论的话,假设每一个生果品种都有独自的扣头率,则这个count仍是3的倍数,把除了以2修正为除了以3就能够

#co妹妹and饬令为:
bash /data/home/tina/script/test.sh 8.8 3.5 9.9 1 2 3 0.9 0.88 0.95

然而关于优惠券来讲,那一定是对这个绑缚商品的全体优惠了,就是独自的一个参数,假设优惠券为5元,持续追加参数

#co妹妹and饬令为:
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,不外要是前面另有其余的需要,这个逻辑又要修正,很烦额,关于计划二,则不必修正之前的逻辑,只用追加就行,不必修正之前的逻辑,剧本就没有写了,这只是举个栗子。

其实,因为工作需求,才接触到要写shell剧本,首次看到一脸懵逼,这个场景也是模仿的,其实是要对少量量的年夜文件进行解决,而后边学边看,发现这些饬令超等……怎样说呢?觉得就像发现了新年夜陆,性能弱小……

记载第一次写shell剧本,嗯,就这酱紫(e妹妹妹妹m……剧本未做容错解决)……


再增补学到的几个简略的饬令,不克不及忘了……
1 dos2unix 将Windows下文件中的换行键转换成Unix下的换行键(可以使用Notepad++编纂器看到window下为换行符为CR LF,unix下的换行符为LF)
2 sort 对文件依照指定例则进行排序
3 co妹妹 将两个有序文件进行比照,能够取赴任集、交加(性能很弱小,而后两个文件必需是有序的,否则会报错,也就是上个sort饬令排序过的文件)
4 wc 统计文件行数(其实就是统计换行符)
5 $@ 剧本的一切参数
6 $# 剧本参数个数
7 ${@:1:4} 指代剧本参数从1开端至第4个(能够范畴抉择)

更多PHP相干技巧文章,请拜访PHP教程栏目进行学习!

以上就是PHP通报数组格局参数到shell剧本中的具体内容,更多请存眷资源魔其它相干文章!

标签: php php开发教程 php开发资料 php开发自学

抱歉,评论功能暂时关闭!