国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

PHP傳遞數(shù)組格式參數(shù)到shell腳本中

fuyi501 / 3109人閱讀

摘要:中傳遞類似于數(shù)組格式數(shù)據(jù)到腳本中模擬場(chǎng)景計(jì)算捆綁商品的價(jià)格,捆綁商品中包含多個(gè)商品,這個(gè)商品是不確定的,我們暫時(shí)定義為蘋果栗子香蕉,價(jià)格分別為元斤元斤元斤,重量規(guī)格定為,我們把價(jià)格當(dāng)做參數(shù)傳遞給腳本計(jì)算總價(jià)格以下是關(guān)于部分的代碼命令為下面是

PHP中傳遞類似于“數(shù)組”格式數(shù)據(jù)到shell腳本中:

模擬場(chǎng)景1

計(jì)算捆綁商品的價(jià)格,捆綁商品中包含多個(gè)商品,這個(gè)商品是不確定的,我們暫時(shí)定義為蘋果、栗子、香蕉,價(jià)格分別為8元/斤、10元/斤、3元/斤,重量規(guī)格定為500g,我們把價(jià)格當(dāng)做參數(shù)傳遞給shell腳本計(jì)算總價(jià)格
以下是關(guān)于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;
// command命令為:
// bash /data/home/tina/script/test.sh 8 3 10

下面是關(guān)于test.sh腳本內(nèi)容:

#!/bin/bash

all=0
for price in $@
do
    all=`expr ${all} + ${price}`
done
echo ${all}
模擬場(chǎng)景2

在場(chǎng)景1的情況下,我們修改價(jià)格為浮點(diǎn)數(shù),蘋果、栗子、香蕉價(jià)格分別為8.8元/斤、9.9元/斤、3.5元/斤,expr表達(dá)式會(huì)報(bào)錯(cuò)(expr: 參數(shù)數(shù)目錯(cuò)誤),expr不支持浮點(diǎn)類型,這里應(yīng)該采用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}
模擬場(chǎng)景3

在場(chǎng)景2的基礎(chǔ)上,捆綁商品現(xiàn)在需要變更重量,蘋果0.5KG、香蕉1KG、栗子1.5KG,則計(jì)算價(jià)格時(shí),我們也需要把重量的參數(shù)傳遞到shell腳本中,才能計(jì)算價(jià)格。
方案一:繼續(xù)把這些參數(shù)加在腳本之后,把參數(shù)個(gè)數(shù)一分為二,我們知道前面一半部分為價(jià)格參數(shù),后半段參數(shù)為重量參數(shù),修改如下:
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;
// command命令為:
// 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}

方案二:把這兩種數(shù)據(jù)進(jìn)行分組,就類似于PHP的數(shù)組一樣,這樣需要在命令中將每組參數(shù)分別用單引號(hào)包裹,這樣shell則會(huì)認(rèn)為只有兩個(gè)參數(shù),再在shell腳本中當(dāng)做數(shù)組來處理,修改如下:
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 ""; //添加單引號(hào)
foreach ($prices as $price) {
    $command .= $price." ";
}
$command = trim($command) . "" "";  //添加單引號(hào)
foreach ($weights as $weight) {
    $command .= $weight." ";
}
$command = trim($command) . """;  //添加單引號(hào)
$output = array();
$ret = 1;
exec($command." 2>&1", $output, $ret);
var_dump($command, $output, $ret);exit;
// command命令為:
// 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

對(duì)比于方案一和方案二,從長遠(yuǎn)看,個(gè)人認(rèn)為還是方案二占優(yōu)勢(shì)一些,易于區(qū)分:可以明顯知道第一個(gè)參數(shù)是價(jià)格組,第二個(gè)參數(shù)是重量組,可擴(kuò)展:例如后續(xù)還要增加一個(gè)折扣率的參數(shù)(折扣率分別為0.9、0.88、0.95),優(yōu)惠券減價(jià)5元等;
對(duì)于方案一,這個(gè)count的值是不固定的,折扣率計(jì)算的話,假定每個(gè)水果種類都有多帶帶的折扣率,則這個(gè)count還是3的倍數(shù),把除以2修改為除以3就可以

#command命令為:
bash /data/home/tina/script/test.sh 8.8 3.5 9.9 1 2 3 0.9 0.88 0.95

但是對(duì)于優(yōu)惠券來說,那肯定是對(duì)這個(gè)捆綁商品的整體優(yōu)惠了,就是多帶帶的一個(gè)參數(shù),假定優(yōu)惠券為5元,繼續(xù)追加參數(shù)

#command命令為:
bash /data/home/tina/script/test.sh 8.8 3.5 9.9 1 2 3 0.9 0.88 0.95 5

這個(gè)時(shí)候也已經(jīng)不好區(qū)分了,一連串?dāng)?shù)字,不利于后續(xù)維護(hù),接手的人肯定一臉懵逼,這都是些什么參數(shù)啊,然后內(nèi)心開始一陣吐槽,方案一想想辦法也能修改count=(參數(shù)個(gè)數(shù)-1)/3,不過要是后面還有其他的需求,這個(gè)邏輯又要修改,很煩額,對(duì)于方案二,則不用修改以前的邏輯,只用追加就行,不用修改以前的邏輯,腳本就不寫了,這只是舉個(gè)栗子。

其實(shí),由于工作需要,才接觸到要寫shell腳本,初次看到一臉懵逼,這個(gè)場(chǎng)景也是模擬的,實(shí)際上是要對(duì)大批量的大文件進(jìn)行處理,然后邊學(xué)邊看,發(fā)現(xiàn)這些命令超級(jí)……怎么說呢?感覺就像發(fā)現(xiàn)了新大陸,功能強(qiáng)大……

記錄第一次寫shell腳本,嗯,就這醬紫(emmmmm……腳本未做容錯(cuò)處理)……


再補(bǔ)充學(xué)到的幾個(gè)簡單的命令,不能忘了……
1 dos2unix 將Windows下文件中的換行鍵轉(zhuǎn)換成Unix下的換行鍵(可使用Notepad++編輯器看到window下為換行符為CR LF,unix下的換行符為LF)
2 sort 對(duì)文件按照指定規(guī)則進(jìn)行排序
3 comm 將兩個(gè)有序文件進(jìn)行對(duì)比,可以取到差集、交集(功能很強(qiáng)大,然后兩個(gè)文件必須是有序的,不然會(huì)報(bào)錯(cuò),也就是上個(gè)sort命令排序過的文件)
4 wc 統(tǒng)計(jì)文件行數(shù)(其實(shí)就是統(tǒng)計(jì)換行符)
5 $@ 腳本的所有參數(shù)
6 $# 腳本參數(shù)個(gè)數(shù)
7 ${@:1:4} 指代腳本參數(shù)從1開始至第4個(gè)(可以范圍選擇)

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/31808.html

相關(guān)文章

  • 玩轉(zhuǎn)Linux - shell 編程基礎(chǔ)

    摘要:數(shù)組中可以存放多個(gè)值,與大部分編程語言類似,數(shù)組元素的下標(biāo)由開始。定義數(shù)組在中,用括號(hào)來表示數(shù)組,數(shù)組元素用空格符號(hào)分割開。 簡述 使用 linux 就離不開 shell,那么也就是說也離不開 shell 編程。很多時(shí)候服務(wù)器都需要編寫一些計(jì)劃任務(wù)來定時(shí)運(yùn)行的,所以掌握一些基本的 shell 編程基礎(chǔ)很有必要。 本文是我在網(wǎng)上收集的一些資料,主要目的是幫助自己更好的了解掌握 shell...

    null1145 評(píng)論0 收藏0
  • php超全局變量,魔術(shù)常量,魔術(shù)方法

    摘要:注意和是不同的變量,處理它們的方式不同變量說明默認(rèn)情況下包含了,和的數(shù)組。包含相同的信息,但它不是一個(gè)超全局變量。這些特殊的常量不區(qū)分大小寫,如下幾個(gè)的魔術(shù)常量名稱說明文件中的當(dāng)前行號(hào)。 整理了下關(guān)于php的基礎(chǔ)知識(shí),參考了些資料,如下: 超全局變量 超全局變量 — 超全局變量是在全部作用域中始終可用的內(nèi)置變量: $GLOBALS $GLOBALS — 引用全局作用域中可用的全部變量 ...

    mj 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<