摘要:中傳遞類似于數組格式數據到腳本中模擬場景計算捆綁商品的價格,捆綁商品中包含多個商品,這個商品是不確定的,我們暫時定義為蘋果栗子香蕉,價格分別為元斤元斤元斤,重量規格定為,我們把價格當做參數傳遞給腳本計算總價格以下是關于部分的代碼命令為下面是
PHP中傳遞類似于“數組”格式數據到shell腳本中:
模擬場景1計算捆綁商品的價格,捆綁商品中包含多個商品,這個商品是不確定的,我們暫時定義為蘋果、栗子、香蕉,價格分別為8元/斤、10元/斤、3元/斤,重量規格定為500g,我們把價格當做參數傳遞給shell腳本計算總價格
以下是關于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
下面是關于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 ); $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}
方案二:把這兩種數據進行分組,就類似于PHP的數組一樣,這樣需要在命令中將每組參數分別用單引號包裹,這樣shell則會認為只有兩個參數,再在shell腳本中當做數組來處理,修改如下:
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." "; } $command = trim($command) . "" ""; //添加單引號 foreach ($weights as $weight) { $command .= $weight." "; } $command = trim($command) . """; //添加單引號 $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
對比于方案一和方案二,從長遠看,個人認為還是方案二占優勢一些,易于區分:可以明顯知道第一個參數是價格組,第二個參數是重量組,可擴展:例如后續還要增加一個折扣率的參數(折扣率分別為0.9、0.88、0.95),優惠券減價5元等;
對于方案一,這個count的值是不固定的,折扣率計算的話,假定每個水果種類都有多帶帶的折扣率,則這個count還是3的倍數,把除以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
但是對于優惠券來說,那肯定是對這個捆綁商品的整體優惠了,就是多帶帶的一個參數,假定優惠券為5元,繼續追加參數
#command命令為: 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腳本,嗯,就這醬紫(emmmmm……腳本未做容錯處理)……
再補充學到的幾個簡單的命令,不能忘了……
1 dos2unix 將Windows下文件中的換行鍵轉換成Unix下的換行鍵(可使用Notepad++編輯器看到window下為換行符為CR LF,unix下的換行符為LF)
2 sort 對文件按照指定規則進行排序
3 comm 將兩個有序文件進行對比,可以取到差集、交集(功能很強大,然后兩個文件必須是有序的,不然會報錯,也就是上個sort命令排序過的文件)
4 wc 統計文件行數(其實就是統計換行符)
5 $@ 腳本的所有參數
6 $# 腳本參數個數
7 ${@:1:4} 指代腳本參數從1開始至第4個(可以范圍選擇)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/31808.html
摘要:數組中可以存放多個值,與大部分編程語言類似,數組元素的下標由開始。定義數組在中,用括號來表示數組,數組元素用空格符號分割開。 簡述 使用 linux 就離不開 shell,那么也就是說也離不開 shell 編程。很多時候服務器都需要編寫一些計劃任務來定時運行的,所以掌握一些基本的 shell 編程基礎很有必要。 本文是我在網上收集的一些資料,主要目的是幫助自己更好的了解掌握 shell...
摘要:注意和是不同的變量,處理它們的方式不同變量說明默認情況下包含了,和的數組。包含相同的信息,但它不是一個超全局變量。這些特殊的常量不區分大小寫,如下幾個的魔術常量名稱說明文件中的當前行號。 整理了下關于php的基礎知識,參考了些資料,如下: 超全局變量 超全局變量 — 超全局變量是在全部作用域中始終可用的內置變量: $GLOBALS $GLOBALS — 引用全局作用域中可用的全部變量 ...
閱讀 2395·2021-11-11 16:54
閱讀 1204·2021-09-22 15:23
閱讀 3644·2021-09-07 09:59
閱讀 1990·2021-09-02 15:41
閱讀 3283·2021-08-17 10:13
閱讀 3037·2019-08-30 15:53
閱讀 1235·2019-08-30 13:57
閱讀 1210·2019-08-29 15:16