ユーザー入力の文字数を数える次のスクリプトがあります。
echo -n "Type text: ";
read mystring;
echo -n $mystring | wc -m;
最後の行に「-n」がないと、echoを介して配置された改行文字も含まれるため、文字数が正しくありません(たとえば、「abc」の数は3ではなく4になります)。
練習のために、この修正をより複雑な方法で実行したいと思います。一般的なアイデアは次のとおりです。
var=$($mystring | wc -m);
echo -n "Type text: ";
read mystring;
echo $(( $var - 1 ));
したがって、ユーザーが入力した文字数は$ varになり、$ varから1を減算します。どのように機能させますか?
答え1
スクリプトが実行されない理由はいくつかあります。
- この時点ではnullなので、最初に
var
実行されているコマンドの出力と同じになるように初期化してください。| wc -m
mystring
- 空でなくても、内容をコマンドとして実行し、その出力を
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
成功時に1つを追加する理由です。
ほとんどのシェル実装(例外を含む)では、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
シェル変数の内容の長さを返します。mystring
答え4
Bashでは次のように使用します。
#!/usr/bin/env bash
read -p 'Type text: ' userInput
printf 'Your input was %d chars long\n' "${#userInput}"
文字列の数はで検索できます${#var}
。wc
この場合、使用する必要はありません。