쉘 스크립트에서 확인 표시/십자 표시 인쇄

쉘 스크립트에서 확인 표시/십자 표시 인쇄

쉘 스크립트에서 확인 표시와 십자 표시를 인쇄하고 싶습니다.

#!/bin/bash

echo -e "\xE2\x9C\x94 existing"
echo -e "\xE2\x9D\x8C missing"

왜 이것이 작동하지 않습니까?

답변1

댓글에서 OP 가 밝혔듯이 그들은 sh file.sh./bin/sh

예를 들어 Ubuntu에서 기본 쉘은 dash.

$ dash
$ printf "\xE2\x9C\x94 missing\n"
\xE2\x9C\x94 missing
$ echo -e "\xE2\x9C\x94"
-e \xE2\x9C\x94

대화형 셸에서 명령을 호출할 때 작동하는 이유는 기본적으로 사용자 대화형 셸(Ubuntu의 경우) 때문입니다./bin/bash

스크립트를 올바르게 실행하려면 다음이 필요합니다.

  • 다음과 같이 실행./file.sh
  • 올바른 쉘에 대한 인수로 실행하십시오.bash file.sh

또는 쉘 독립적 접근 방식이 가능합니다.

# this printf is standalone program, not shell built-in
$ /usr/bin/printf "\xE2\x9C\x94 check mark\n"
✔ check mark

$ python -c 'print "\xE2\x9C\x94 check mark"'
✔ check mark

$ perl -e 'print "\xE2\x9C\x94 check mark"'                                                                              
✔ check mark

답변2

이는 \xE2\x9C\x94U+2714의 UTF-8 인코딩입니다(체크표시 반복) 특징.

터미널의 문자 집합이 UTF-8이고 해당 문자 집합의 글꼴을 사용하는 경우 이 3바이트는 확인 표시로만 나타납니다.

터미널 에뮬레이터의 경우 사용하는 문자 세트는 일반적으로 시작 시 로케일의 문자 세트입니다. 해당 터미널에서 실행하는 셸의 로캘을 변경하지 않은 경우 어떤 언어를 사용하는지 알 수 있습니다.

locale charmap

printf여러 구현은 GNU printfprintf내장을 모두 지원 zsh하며 (적어도 bash데비안 기반 시스템의 lkshPOSIX 호환 변형 ):mksh

$ printf '\u2714\u274c\n'
✔❌

로케일의 문자 세트에 대한 올바른 인코딩으로 이러한 문자를 인쇄하십시오(ksh93의 printf내장도 이 \uXXXX표현을 지원하지만 로케일의 문자 세트에 관계없이 항상 UTF-8로 출력합니다). printf이를 내장하고 확장된 이스케이프 시퀀스(아마도 포함)를 지원 echo하는 쉘은 -e일반적 \uXXXX으로 해당 기능도 지원합니다.

이제 일반적인 GNU 시스템에서 사용할 수 있는 두 문자 세트인 AFAICT는 UTF-8과 GB18030(U+274C 및 U+2714 문자)입니다. 다른 문자 세트를 사용하는 로케일에서는 printf이러한 문자가 존재하지 않기 때문에 표시되지 않습니다. 구현에 따라 문자 그대로 인쇄 printf되거나 \u274C오류와 함께 실패합니다.

일부 쉘( 원래 FreeBSD )도 참조에서 이 표기법을 지원합니다 zsh.bashksh93mkshsh\uXXXX$'...'

그래서 당신은 이것을 할 수 있습니다 :

echo $'\u2714\u274c'

bash셸에 따라 이는 명령을 구문 분석할 때( ), 명령을 실행할 때( ) 또는 항상 UTF-8(ksh)로 zsh실행되는 로케일 인코딩 으로 확장됩니다.

POSIXly(Unix 계열 시스템에서 이식 가능)에서 임의의 바이트 시퀀스를 인쇄하려면 printf및 8진수 표기법을 사용해야 합니다.

\xE2\x9C\x94(U+2714의 UTF-8 인코딩)은 한 줄에 이식 가능하게 인쇄됩니다.

printf '\342\234\224\n'

해당 로캘에 맞는 올바른 인코딩으로 변환하려면 다음과 같이 하세요.

printf '\342\234\224\n' | iconv -f UTF-8

POSIX는 시스템이 지원하는 문자 인코딩이나 이름을 지정하지 않지만 위 명령은 일반적으로 UTF-8 인코딩을 지원하는 POSIX 시스템에서 작동합니다.

답변3

원시 "잘라내기 및 붙여넣기" 유니코드를 사용하면 더 읽기 쉬운 솔루션을 얻을 수 있습니다.

$ echo -e '☑ done\n☒ fail\n☐ to do'
☑ done
☒ fail
☐ to do

관련 정보