그래서 시스템에 사용자를 추가하는 스크립트를 만들었고 사용자 이름 길이를 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 변수가 항상 다음과 같이 문자를 추가하는 것 같다는 것입니다.
[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]$
비워두더라도 여전히 한 문자로 계산됩니다.
[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
문자가 계산됩니다.
아니면 파이프 없이 순수한 Bash를 사용하는 것이 더 나을 수도 있습니다 wc
.
$ string=foobar
$ echo "${#string}"
6
답변2
나는 또한 쉘의 "인수 확장" 접근 방식을 선호하지만, 그렇게 한다면 wc
단어 개수 옵션을 사용할 수도 있습니다.
read LENGTH WORDS REST <<<$(echo -n ${USERNAME} | wc -cw)
echo $LENGTH $WORDS
2 8
멀티바이트 국제 문자가 아닌 ASCII 문자만 사용해야 할 수도 있습니다.
내부 경로를 선택하면 bash
공백이 있는지 확인할 수 있습니다.
[ "$USERNAME" = "${USERNAME%% *}" ] && echo No spaces || echo some spaces