2016-11-13 8 views
1

私は2つの変数の違いを示す単純なBashスクリプトを書こうとしています。両方の変数に同じ値の異なるパラメータが含まれていることを前提としています。 $sam$pishの変数を見てください。パラメータはdriver_mode$sam1であり、2$pishであることを除き、同じです。この比較を行うために、各変数を別々の配列に格納し、各要素を1つずつ比較します。上記のbashスクリプトを実行2つの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 

は私にエラーを与える:

./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したいのですが、その後、あなたの最後の1は、最初の段落が正しかったことを正確な方法で間違っていることによってそれを相殺します。 (つまり、 '$ index'ではなく' index'を書くことができる理由は、配列インデックスは '-ne'の引数と全く同じ算術コンテキストです) – ruakh

+1

@ruakhこれで修正されました;-) – janos

+0

@ruakh、実際には '$ {!array_old [@]}'は数値インデックスに展開されます。私は文字列コンテキストでインデックスを使用するために使用され、この機能を完全に忘れています。ありがとう。 –

関連する問題