wc -c는 추가 문자 수를 제공합니다.

wc -c는 추가 문자 수를 제공합니다.

그래서 시스템에 사용자를 추가하는 스크립트를 만들었고 사용자 이름 길이를 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

관련 정보