そのため、ユーザーをシステムに追加するスクリプトを作成し、ユーザー名の長さを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:
この問題を特定する方法は?
空白のままにしても、どういうわけか1文字を数えます[。 。 。]誰かが私がこの問題を特定するのを手伝ってくれませんか?
printf
の代わりにecho
を試してください
$ echo "" | wc -m
1
$ printf "" | wc -m
0
echo
を使用すると、wc
は改行文字をカウントします。
または、おそらくより良い方法として、wc
にパイプしないで純粋なBashを使用します。
$ string=foobar
$ echo "${#string}"
6
シェルの「パラメータ拡張」方法も好みます。ただし、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