一小段代碼:
function write_xml()
{
change=${!1}
if [ $change ]; then
if [ $change = "sr_null" ];then
# sed -i "s/\"$control\">.*</\"$control\"></" $path
sed -i "/\"$1\"/s/\">.*</\"></" $path
else
# sed -i "s/\"$control\">.*</\"$control\">$change</" $path
sed -i "/\"$1\"/s/\">.*</\">$change</" $path
fi
echo "$1 = $change"
#else
# echo "$control is not be setted"
fi
}
//“1"代表第一個參數,”${!1}"代表間接引用參數1的值
比如: a = true; c= ${!1},其實表示將a的值間接賦給c, c= true;
if[$change];then 判斷是否獲取到值
sed -i "/\"$1\"/s/\">.*</\">$change</" $path
sed -i 表示字符串查找並替換
$1表示獲取第一個參數
/"$1"/s/">.*< 其實就是參數1之後"><“之間的”.字符","."所有字符
$change</ 獲取簡介引用的字符並修改到><節點中
if[$change = “sr_null”];then判斷獲取到的值是否是sr_null,如果是,則替換爲空字符串
$path相關修改的文件
總的來說,就是如果參數1的字符串有被賦值,那麼就在path路徑下找到參數1的字符串,並將參數1後的尖括號中><的字符串替換爲賦值的字符串。
那麼${!1}這個參數是怎麼從projectConfig.mk中獲取出來的呢?
我們來看一下makesagereal這個腳本,其中有如下一段:
$prj = "../sagereal/mk/$new_project/ProjectConfig.mk";
open (FILE_HANDLE, "<$prj") or die "cannot open $prj\n";
while (<FILE_HANDLE>)
{
if (/^(\S+)\s*=\s*(\S+)/)
{
$ENV{$1} = $2;
}
}
其實類似我們的HashMap,將value對應的key保存起來,那麼在後續的調用中就可以直接獲取出來。
modified for default date(2016/11/01)
if [ $default_restore_year ];then
sed -i "/RTC_DEFAULT_YEA/s/RTC_DEFAULT_YEA.*/RTC_DEFAULT_YEA $default_restore_year/" ../alps/mediatek/custom/$base_project/preloader/inc/cust_rtc.h
sed -i "/RTC_DEFAULT_YEA/s/RTC_DEFAULT_YEA.*/RTC_DEFAULT_YEA $default_restore_year/" ../alps/mediatek/custom/$base_project/kernel/rtc/rtc/rtc-mt.h
sed -i "/RTC_DEFAULT_YEA/s/RTC_DEFAULT_YEA.*/RTC_DEFAULT_YEA $default_restore_year/" ../alps/mediatek/custom/$base_project/kernel/rtc/rtc/rtc-mt6575.h
fi
if [ $default_restore_month ];then
sed -i "/RTC_DEFAULT_MTH/s/RTC_DEFAULT_MTH.*/RTC_DEFAULT_MTH $default_restore_month/" ../alps/mediatek/custom/$base_project/preloader/inc/cust_rtc.h
sed -i "/RTC_DEFAULT_MTH/s/RTC_DEFAULT_MTH.*/RTC_DEFAULT_MTH $default_restore_month/" ../alps/mediatek/custom/$base_project/kernel/rtc/rtc/rtc-mt.h
sed -i "/RTC_DEFAULT_MTH/s/RTC_DEFAULT_MTH.*/RTC_DEFAULT_MTH $default_restore_month/" ../alps/mediatek/custom/$base_project/kernel/rtc/rtc/rtc-mt6575.h
fi
if [ $default_restore_day ];then
sed -i "/RTC_DEFAULT_DOM/s/RTC_DEFAULT_DOM.*/RTC_DEFAULT_DOM $default_restore_day/" ../alps/mediatek/custom/$base_project/preloader/inc/cust_rtc.h
sed -i "/RTC_DEFAULT_DOM/s/RTC_DEFAULT_DOM.*/RTC_DEFAULT_DOM $default_restore_day/" ../alps/mediatek/custom/$base_project/kernel/rtc/rtc/rtc-mt.h
sed -i "/RTC_DEFAULT_DOM/s/RTC_DEFAULT_DOM.*/RTC_DEFAULT_DOM $default_restore_day/" ../alps/mediatek/custom/$base_project/kernel/rtc/rtc/rtc-mt6575.h
fi