Bash
字元計數練習(bash)
我有以下腳本計算使用者輸入中的字元:
echo -n "Type text: "; read mystring; echo -n $mystring | wc -m;
如果最後一行中沒有“-n”,字元計數將是錯誤的,因為它還包括由 echo 放在那裡的換行符(因此例如“abc”的計數將是 4 而不是 3。)
為了練習起見,我現在想以更複雜的方式進行此校正。大體構想是這樣的:
var=$($mystring | wc -m); echo -n "Type text: "; read mystring; echo $(( $var - 1 ));
所以使用者輸入的字元數變成了 $ var and then I subtract 1 from $ 變種。我如何使它工作?
您的腳本不起作用有幾個原因:
- 您首先初始化
var
為等於執行命令的輸出,| wc -m
因為mystring
此時為空。- 即使它不為空,它也會嘗試將其內容作為命令執行,並將該輸出發送到
wc
.你必須 A> 以正確的順序做事,並且 ii.> 做正確的事:
read -p "Type something > " mystring var="$( wc -m <<< "$foo" )" echo $(($var-1))
如果要計算使用者輸入的字元數,但不包括換行符,則應為:
#! /bin/sh - printf 'Type text: ' IFS= read -r userInput length=$(printf %s "$userInput" | wc -m) # or: length=${#userInput}
如果要包含使用者可能輸入的換行符,則:
#! /bin/sh - printf 'Type text: ' IFS= read -r userInput && userInput="$userInput " length=$(printf %s "$userInput" | wc -m) # or: length=${#userInput}
read
如果輸入了整行(存在換行符),通常會返回trueread
,這就是我們在成功時添加一個的原因。請注意,在大多數 shell 實現中(例外),如果使用者輸入 NUL(又名)字元
zsh
,它將無法正常工作。^@
要解決此問題,您可以執行以下操作:
printf 'Type text: ' length=$(line | wc -m)
反而。或者:
length=$(line | tr -d '\n' | wc -m) # or length=$(($(line | wc -m) - 1)) # as line always includes a newline on # output even if one was not provided on # input.
如果您不想計算換行符。
如果使用者設法輸入不構成有效字元一部分的字節,行為也會有所不同。您還會發現一些無法正常使用多字節字元的
sh
實現(將返回以字節為單位的長度而不是字元)。${#var}