.png)
我有以下腳本來計算用戶輸入中的字元:
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,然後我從 $var 中減去 1。我該如何讓它發揮作用?
答案1
您的腳本無法執行有以下幾個原因:
- 首先將其初始化
var
為等於運行命令的輸出,| wc -m
因為mystring
此時 為 null。 - 即使它不為空,它也會嘗試將其內容作為命令運行,並將該輸出發送到
wc
.
你必須 A> 以正確的順序做事,並且 ii.> 做正確的事:
read -p "Type something > " mystring
var="$( wc -m <<< "$foo" )"
echo $(($var-1))
答案2
如果您想計算使用者輸入的字元數,但不包括換行符,那麼應該是:
#! /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
通常會返回真的如果輸入了一整行(存在換行符),這就是為什麼我們在read
成功時追加一個。
請注意,在大多數 shell 實作中(zsh
例外),如果使用者輸入 NUL(又稱^@
)字符,它將無法正常運作。
要解決這個問題,您可以這樣做:
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}
(將返回位元組長度而不是字元長度)。
答案3
expr " $mystring" : '.*' - 1
將返回 shell 變數內容的長度mystring
答案4
在 bash 中你會使用
#!/usr/bin/env bash
read -p 'Type text: ' userInput
printf 'Your input was %d chars long\n' "${#userInput}"
字串計數可以透過 檢索${#var}
。wc
在這種情況下沒有必要使用