編程題:多條shell腳本中的變量替換

題目:

給定多條shell腳本,求最後一條shell中變量的完整值。其中每條腳本中“=”左側爲變量名,等號右側中以“${”和“}”包圍起來的是需要替換的變量名,例如

tencent=qq${wx}
wx=weixin

tencent=qqweixin
輸入示例:

4
x=root/${y}/host
y=net
z=tomcat
last=/home/${x}/local/${z}/com

輸出示例:

/home/root/net/host/local/tomcat/com

規定:

①不存在交叉引用,即不會出現類似下列情況:

x=${y}
y=${x}

②可能存在某變量的引用變量在該條腳本後面出現,如:

x=${y}
y=z

③除輸入第一行爲表示腳本行數的數字外,其餘均爲字符串。

解題思路

思路:遞歸。首先讀取輸入,將除最後一行的腳本之外的腳本以dict形式存儲,構建遞歸函數,處理最後一行腳本。

import sys
in_list = []
for line in sys.stdin:
    sh_cnt = int(line.split()[0])
    if sh_cnt!=0:
        for i in range(sh_cnt):#存儲
            sh_item = input()
            sh_item = sh_item.split()[0]
            in_list.append(sh_item)#字符串
        break
    else:
        break

back_str_list = in_list[:-1]#除去最後一個
out_str_org = in_list[-1]#最後一行
back_str_dict = dict()#將所有變量以dict形式存儲

#定義字符串轉dict函數
def str_2_dict(in_list, in_dict):
    for in_list_i in in_list:
        split_list = in_list_i.split('=')#分拆
        in_dict[split_list[0]] = split_list[1]#存進dict
str_2_dict(back_str_list, back_str_dict)

#定義遞歸函數
def digui_process(in_str, in_dict):
    out_str = in_str
    if "${" in out_str and "}" in out_str:
        #查找變量位置
        cnt = out_str.count("${")
        for cnt_i in range(cnt):
            front = out_str.find("${")
            tmp_str = out_str#使用tmp_str而不是直接使用out_str確保front索引有效
            out_str = tmp_str[:front]#截取待替換前字符串保存到out_str
            rest_str = tmp_str[front+2:]
            end = rest_str.find("}")
            if end!=-1:#存在配對
                bianliang_str = rest_str[:end]
                bianliang_value = in_dict[bianliang_str]
                out_str += digui_process(bianliang_value, in_dict)
                out_str+=rest_str[end+1:]
            else:
                out_str+=rest_str#不存在配對則直接合並
    #     return out_str
    # else:#如果不存在需要替換的變量
    #     return in_str
    return out_str#以上三行合併成此條return

split_index = out_str_org.find('=')#去掉最後一行腳本的變量名和“=”,按格式輸出
print(digui_process(out_str_org, back_str_dict)[split_index+1:])

輸入輸出:
輸入輸出

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章