web-dev-qa-db-ja.com

wc -cを使用すると、文字数が1つ増えます

そのため、ユーザーをシステムに追加するスクリプトを作成し、ユーザー名の長さを8文字以下に強制したいと考えました。

#!/bin/bash
# Only works if you're root

for ((a=1;a>0;a)); do
 if [[ "$UID" -eq 0 ]]; then
  echo "Quit this shit anytime by pressing CTRL + C"
  read -p 'Enter one usernames: ' USERNAME
  nrchar=$(echo ${USERNAME} | wc -c)
  echo $nrchar
  spcount=$(echo ${USERNAME} | tr -cd ' ' | wc -c)
  echo $spcount
  if [[ "${nrchar}" -ge 8 ]]; then
    echo "You may not have more than 8 characters in the username"
   Elif [[ "${spcount}" -gt 0 ]]; then
    echo "The username may NOT contain any spaces"
   else
     read -p 'Enter one names of user: ' COMMENT
     read -s -p 'Enter one passwords of user: ' PASSWORD
     useradd -c "${COMMENT}" -m ${USERNAME}
     echo ${PASSWORD} | passwd --stdin ${USERNAME}
     passwd -e ${USERNAME}
   fi
 echo "------------------------------------------------------"
 else
  echo "You're not root, so GTFO!"
  a=0
 fi
done

これは完全なスクリプトですが、問題はここのどこかにあると思います。

  read -p 'Enter one usernames: ' USERNAME
  nrchar=$(echo ${USERNAME} | wc -c)
  echo $nrchar

したがって、これの問題は、8文字のユーザー名を入力するたびに、nrchar変数が常に1文字追加するように見えることです。

[vagrant@localhost vagrant]$ Sudo ./exercise2-stuffs.sh
Quit this shit anytime by pressing CTRL + C
Enter one usernames: userdoi1
9
0
You may not have more than 8 characters in the username
------------------------------------------------------
Quit this shit anytime by pressing CTRL + C
Enter one usernames: ^C
[vagrant@localhost vagrant]$ 

空白のままにしても、なんとかして1文字と数えられます。

[vagrant@localhost vagrant]$ Sudo !.
Sudo ./exercise2-stuffs.sh
Quit this shit anytime by pressing CTRL + C
Enter one usernames:
1
0
Enter one names of user:

この問題を特定する方法は?

2
iamAguest

空白のままにしても、どういうわけか1文字を数えます[。 。 。]誰かが私がこの問題を特定するのを手伝ってくれませんか?

printfの代わりにechoを試してください

$ echo "" | wc -m
1
$ printf "" | wc -m
0

echoを使用すると、wcは改行文字をカウントします。

または、おそらくより良い方法として、wcにパイプしないで純粋なBashを使用します。

$ string=foobar
$ echo "${#string}"
6
7
maulinglawns

シェルの「パラメータ拡張」方法も好みます。ただし、wcを使用する場合は、そのワードカウントオプションも使用できます。

read LENGTH WORDS REST <<<$(echo -n ${USERNAME} | wc -cw)
echo $LENGTH $WORDS 
2 8

ASCII文字のみが使用されていることを確認することをお勧めします-マルチバイト国際文字は使用しないでください。

bash internalsパスに移動する場合、スペースのチェックは次のようになります。

[ "$USERNAME" = "${USERNAME%% *}" ] && echo No spaces || echo some spaces
0
RudiC