shell 脚本中的 Unicode 到 github API

问题描述 投票:0回答:1

我正在尝试使用 github api 创建标签,但将表情符号传递给标签名称。关于如何正确执行此操作有什么想法吗?

source config.txt

labels2=(
    "Sleep $zzz_unicode:FFFFFF"
)

# Read repository names from file
while IFS= read -r repo; do
    REPO_USER=$(echo "$repo" | cut -f1 -d /)
    REPO_NAME=$(echo "$repo" | cut -f2 -d /)

    echo "-----------------------------------------[$REPO_USER/$REPO_NAME]---------------------------------"

    # Iterate over labels
    for label in "${labels2[@]}"; do
        label_name=$(echo "$label" | cut -d ":" -f 1)
        label_color=$(echo "$label" | cut -d ":" -f 2)


        data="{\"name\":\"$label_name $emoji\",\"color\":\"$label_color\"}"
        response=$(curl -s -w "%{http_code}" -u "$token:x-oauth-basic" --request POST --data "$data" "https://api.github.com/repos/$REPO_USER/$REPO_NAME/labels")
        response_code=$(echo "$response" | tail -n1)
        response_body=$(echo "$response" | sed '$d')
        if [[ $response_code -eq 201 ]]; then
            echo "Label '$label_name $emoji' created successfully in repository '$REPO_USER/$REPO_NAME'"
        else
            echo "Failed to create label '$label_name $emoji' in repository '$REPO_USER/$REPO_NAME'. Response: $response_body"
        fi
    done

done < repo_names.txt

尝试使用 github unicode,以及标签创建中的实际表情符号:

"Bug 🐛:FF0000"

"Sleep $zzz_unicode:FFFFFF"

我在存储库上手动创建了一个标签:

Bug 🐛
带有颜色
FF0000
。我可以运行一个脚本来返回该存储库的所有标签:

Fetching labels for Repo...
[
  {
    "id": someID,
    "node_id": "some_nodeID",
    "url": "https://api.github.com/repos/repo/labels/test%20%F0%9F%90%9B",
    "name": "test 🐛",
    "color": "ff0000",
    "default": false,
    "description": ""
  }
]

但是,如果我尝试使用上面的脚本在创建过程中使用 github API 以及标签本身中的表情符号为我创建标签:

"Bug 🐛:FF0000"
它会创建标签为
Bug ??

如果我尝试使用 unicode 创建:

"Sleep $zzz_unicode:FFFFFF"
,它会创建标签为
Sleep
请注意,睡眠只是一个测试 -
zzz
是 github zzz 表情符号
💤
,但应该工作相同。

bash shell github github-api
1个回答
0
投票

如果

(1) 所有脚本均以 UTF-8 编码,并且 (2) 您的终端同样支持它,并且 (3) 您正在运行现代版本的 bash(主要是 不是 macOS 上 /bin 中附带的 3.2 版本)

那么 Unicode 字符应该大部分都可以正常工作。这是 bash 对 Unicode 友好的简单演示:

$ printf '%X\n' "'💤"
1F4A4

如您所见,它将表情符号识别为单个字符,并在请求时显示其代码点。

但是许多 UNIX 工具(如

cut
)对于多字节文本来说并不那么安全。我看不到您在代码中的何处设置了您使用的
emoji
变量,但是如果您正在执行任何类型的解析以按照您对存储库和标签所做的方式获取它,则可能是因此给你无效的结果。

坚持使用 bash 内置函数可能会有所帮助。例如,而不是这个:

REPO_USER=$(echo "$repo" | cut -f1 -d /)
REPO_NAME=$(echo "$repo" | cut -f2 -d /)

你可以这样做:

IFS=/ read REPO_USER REPO_NAME _ <<<"$repo"

(虽然我不知道你为什么用全大写来命名这些变量;它们似乎没有被设置为环境变量。)

如果您可以提供整个程序(当然不包括身份验证密钥或其他敏感数据),可能会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.