Bash

bash 讀取換行符,printf 報告字元 0

  • April 20, 2016

我使用 bashprintf函式在輸入文件中列印字元的 ASCII 程式碼,但由於某種原因,printf輸出字元的 ascii 程式碼 0 LF,而不是 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

引用自:https://unix.stackexchange.com/questions/277727