背景
在 linux 下手寫一個命令和拷貝 html 頁面文本域中的命令執行結果完全不同,后者的命令無法被 Linux 識別。
問題截圖
肉眼看不到的區別
肉眼根本看不出來這兩行有什么區別,但執行結果就是有問題。
問題定位
編寫測試代碼,執行兩個字符串的 equals 方法,輸出結果是 false。逐個輸出對應字符的 ASCII 值,發現一個 echo 命令后的空格,一個是 32,另一個是 160。而 160 那個空格來自頁面文本域的拷貝值。
網絡搜索果然有關于這兩個空格的坑,160 這個空格是是由頁面上的 產生的空格,全稱為“non-breaking space”,其 UTF-8 編碼值為 u00A0。
解決辦法,將頁面表單中的 160 空格替換為普通空格:
String s11 = "mem_status=`free -m|sed -n '2p'|sed -E 's/ +/ /g'`;mem_total=`echo $mem_status|cut -d \" \" -f 2`;mem_used=`echo $mem_status|cut -d \" \" -f 3`;mem_usedpercent=`echo \"scale=2;$mem_used*100/$mem_total\" | bc | awk '{printf "%.2f", $0}'`;echo $mem_usedpercent";
String s22 = "mem_status=`free -m|sed -n '2p'|sed -E 's/ +/ /g'`;mem_total=`echo $mem_status|cut -d \" \" -f 2`;mem_used=`echo $mem_status|cut -d \" \" -f 3`;mem_usedpercent=`echo \"scale=2;$mem_used*100/$mem_total\" | bc | awk '{printf "%.2f", $0}'`;echo $mem_usedpercent";
System.out.println("s1=s2:"+s11.equals(s22));
s22 = s22.replaceAll("\u00A0+", " ");
s11 = s11.replaceAll("\u00A0+", " ");
System.out.println("s1=s2:"+s11.equals(s22));
就是一個簡單的獲取 Linux 操作系統的磁盤使用百分比的命令集。
替換后兩字符串的 equals 返回真,執行結果:
s1=s2:false
s1=s2:true