2016-11-13 173 views
1

我想写一个简单的bash脚本来显示两个变量之间的差异,假定两个变量都包含具有不同值的相同参数。看看$sam$pish变量。它们是相同的,除了参数driver_mode1$sam2$pish。为了做这个比较,我将每个变量存储到一个单独的数组中,然后逐个比较每个元素。比较两个bash变量

#!/bin/bash 

sam="driver_mode=2 firmware_path=/home/release/firmware/ onebox_zone_enabled=0x10001 ta_aggr=4 skip_fw_load=0 fw_load_mode=1 sdio_clock=40000 enable_antenna_diversity=0 coex_mode=1 obm_ant_sel_val=2 wlan_rf_power_mode=0 bt_rf_power_mode=0 zigb_rf_power_mode=0 country_code=840 bt_rf_tx_power_mode=1 bt_rf_rx_power_mode=0" 

pish="driver_mode=1 firmware_path=/home/release/firmware/ onebox_zone_enabled=0x10001 ta_aggr=4 skip_fw_load=0 fw_load_mode=1 sdio_clock=40000 enable_antenna_diversity=0 coex_mode=1 obm_ant_sel_val=2 wlan_rf_power_mode=0 bt_rf_power_mode=0 zigb_rf_power_mode=0 country_code=840 bt_rf_tx_power_mode=1 bt_rf_rx_power_mode=0" 

read -r -a array_old <<< "$sam" 

read -r -a array_new <<< "$pish" 

for index in "${!array_old[@]}"; do 
    if [[ ${array_old[index]} -ne ${array_new[index]} ]]; then 
     echo ${array_old[index]} 'to' ${array_new[index]}  
    fi 
done 

运行上面的bash脚本给我的错误:

./test: line 12: firmware_path=/home/release/firmware/: syntax error: operand expected (error token is "/home/release/firmware/")

回答

5

-ne运营商是一个整数comparison operator。比较字符串使用!=

for index in "${!array_old[@]}"; do 
    if [[ ${array_old[index]} != "${array_new[index]}" ]]; then 
    echo ${array_old[index]} 'to' ${array_new[index]}  
    fi 
done 
+1

我想+1,因为你的第一款,但随后你的最后一个由自己的错误的确切方式,第一段是正确取消它。 (也就是说,你可以写'index'而不是'$ index'的原因是数组的索引是一个算术上下文,就像'-ne'的参数一样。) – ruakh

+1

@ruakh它现在是固定的;-) – janos

+0

@ruakh,实际上,'$ {!array_old [@]}'扩展为数字索引。我习惯在字符串上下文中使用索引,并完全忘记了这个特性。谢谢。 –