Bash
bash 讀取換行符,printf 報告字元 0
我使用 bash
printf
函式在輸入文件中列印字元的 ASCII 程式碼,但由於某種原因,printf
輸出字元的 ascii 程式碼 0LF
,而不是 10。任何想法為什麼?while IFS= read -r -n1 c do ch=$(LC_CTYPE=C printf "%d\n" "'$c") # convert to integer echo "ch=$ch" done < input_file_name
老實說,我什至不確定這是問題
printf
還是read
函式,它提供了錯誤的 LF 值……還有其他方法可以使用 bash 命令將字元轉換為 ASCII 嗎?
首先,您的 printf 功能可以完美執行
$ export c=" " $ LC_CTYPE=C printf "%d\n" "'$c" 32
但是使用 -vx on 執行腳本行顯示到達該行的數據是錯誤的(我不會粘貼此輸出)
所以我認為這是錯誤的閱讀。讀取的預設 EOL 分隔符是換行符,所以我嘗試更改它。這似乎有效
while IFS= read -d\0 -r -n1 c; do ch=$(LC_CTYPE=C printf "%d\n" "'$c") ; echo "ch=$ch"; done < input_file_name
read
沒有錯,但您對結果的解釋略有錯誤。EOL 標記是
\n
,因此輸入該字元意味著read
遇到了沒有字元的“行”。請注意,該變數$c
不包含\n
:while IFS= read -r c do test -z "$c" && echo "Zero length string" || echo "I read '$c'" done
通過添加
-n1
,您將可以讀取的字元數限制為一個。就像上面的例子一樣,\n
不是接受的字元串的一部分,所以read
當你輸入時返回“nothing”\n
:while IFS= read -r -n1 c do test -z "$c" && echo "Zero length string" || echo "I read '$c'" done
這個
printf
命令很有趣。如果你給它一個單引號前綴的零長度字元串,你也會從中得到'0’,所以我懷疑這裡的答案是“不要那樣做”:LC_CTYPE=C printf "%d" "'" | od -c 0000000 0