Shell-Script

在 shellscript (zsh) 中回顯複選標記

  • January 18, 2022

為什麼在執行我的 shellscript 時這個複選標記沒有正確列印,即使 echo 單獨輸出正確?

腳本:

#!/bin/sh
YELLOW='\033[1;33m'
NC='\033[0m' # no color
echo "enter your provider's auth code"
stty -echo
read authcode
oathtool --totp -b $authcode | xclip -i
echo "${YELLOW}\u2714 code copied to clipboard${NC}"

終端輸出:\u2714 程式碼複製到剪貼板

獨立命令:

echo "\u2714 checkmark"

終端輸出: ✔複選標記

我的外殼是zsh 5.8 (x86_64-debian-linux-gnu) 使用rxvt-unicode-256color終端

你的 shebang 有/bin/sh,我懷疑/bin/shzsh你的系統上。zsh不是 Debian 批准的sh實現之一。無論如何,我建議不要在腳本中使用非標準sh語法。sh

\u2714不是標準echo語法。它將(可能)$'...'在 POSIX 標準的下一個主要版本中成為標準,但不在echoor的參數中printf,而且無論如何 Debian 的預設sh實現 ( dash) 還不支持$'...'

\uXXXXzsh’s printf(在格式參數或參數中%b)、print-raw 除外)和echo(除非啟用-Ebsdecho啟用該選項)內置程序和其內部$'...'(這是在其中引入這些\uXXXX序列的第一個 shell $'...'$'...'引號本身來自 ksh93)。

#! /bin/zsh -如果您想zsh在腳本中使用功能,請將shebang 更改為。

然後,您可以使用更多 zsh 功能,例如:

print -P '%B%F{yellow}\u2714 whatever%f%b'

%F{yellow}使用romptP擴展擴展為終端的正確程式碼,以將前景顏色更改F黃色(並將%f前景色重置為預設值,和%B/%b啟用 / 禁用粗體,如你的\033[1m)。

zsh中,您還可以執行以下操作:

IFS= read -rs 'authcode?enter auth code: '

發出提示並s更可靠地啟用 ilent 輸入。

在任何情況下,例如 in sh,您都可能希望-rIFS=避免read破壞輸入。

您也可以使用set -o pipefailoathtool | xclip管道被視為失敗,如果其中之一oathtoolxclip失敗(不僅僅是xclip)。

請注意,如果語言環境的字元編碼沒有 U+2714 字元,print則會失敗並出現zsh: character not in range錯誤。


在標準sh+ 實用程序語法中,語法應該是:

#! /bin/sh -
bold_yellow='\033[1;33m'
nc='\033[m' # no color
if [ "$(locale charmap)" = UTF-8 ]; then
 check_mark='\0342\0234\0224'
else
 check_mark='[X]'
fi

saved_tty_settings=$(stty -g)
trap 'stty "$saved_tty_settings"' EXIT ALRM TERM INT QUIT
stty -echo
printf >&2 "enter your provider's auth code: "
IFS= read -r authcode &&
 secret=$(oathtool --totp -b "$authcode") &&
 printf %s "$secret" | xclip -i &&
 printf '%b\n' "${bold_yellow}${check_mark} code copied to clipboard${nc}"

這裡對著色轉義序列進行硬編碼,並且僅當區域設置的charmap 為 UTF-8 時才對 U+2714 的 UTF-8 編碼進行硬編碼。

或者你可以這樣做:

check_mark=$(printf '\342\234\224' | iconv -f UTF-8 2> /dev/null) ||
 check_mark='[X]'

如果它有一個(並且在系統上受支持),則check_mark在區域設置的charmap中獲取它,否則。GB18030 是我所知道的唯一具有 U+2714 的其他charmap。它也是 Unicode 的一種編碼,主要在中國使用(例如在Debian 的語言環境中)。UTF-8``[X]``zh_CN.gb18030

引用自:https://unix.stackexchange.com/questions/686672