gpt4 book ai didi

linux - Bash - 变量不在其他变量中计算

转载 作者:太空宇宙 更新时间:2023-11-04 09:30:48 25 4
gpt4 key购买 nike

我写了一个简短的脚本,需要使用正则表达式查找一些文本。

我在 while 循环中递增一个计数器,这个计数器是另一个命令的一部分。不幸的是,此命令始终使用初始计数器运行。

这是我的代码片段:

COUNTER=1
LAST_COMMIT=`git log remotes/origin/devel --pretty=oneline --pretty=format:%s | head -${COUNTER}`
JIRA_ID=`echo $LAST_COMMIT | grep -o -P '[A-Z]{2,}-\d+' | xargs`

while [[ ! -z "$JIRA_ID" && $COUNTER -lt "5" ]]; do
echo "This is the current counter: $COUNTER"
echo "This is the last commit $LAST_COMMIT"
COUNTER=$[COUNTER+1]
done
echo "this is the counter outside the loop $COUNTER"

最佳答案

封装代码的最佳实践方法(根据 BashFAQ #50 )是使用函数:

get_last_commit() {
git log remotes/origin/devel --pretty=oneline --pretty=format:%s \
| sed -n "$(( $1 + 1)) p"
}

然后:

while (( counter < 5 )); do
last_commit=$(get_last_commit "$counter")
IFS=$'\n' read -r -d '' -a jira_id \
< <(grep -o -P '[A-Z]{2,}-\d+' <<<"$last_commit") ||:
[[ $jira_id ]] || break

echo "This is the current counter: $counter"
echo "This is the last commit $last_commit"
echo "Found ${#jira_id[@]} jira IDs"
printf ' %s\n' "${jira_id[@]}"

(( counter++ ))
done

其他说明:

  • 使用 read -a,在这里,将 JIRA ID 读入一个数组;然后,您可以询问数组的长度(使用 ${#jira_id[@]}),从数组中扩展特定条目(使用 ${jira_id[0]}获取第一个 ID,[1] 获取第二个 ID,等等);将它们全部扩展到参数列表中(使用 "${jira_id[@]}")等
  • 非系统定义的 shell 变量的名称中应至少包含一个小写字符。请参阅关于环境变量的 POSIX 规范的第四段 http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap08.html ,请记住环境变量和 shell 变量共享一个命名空间。遵循这种做法可以防止您错误地覆盖系统变量。
  • $(( ... )) 是进入数学上下文的 POSIX 标准方式; (( )) 没有前导 $,是 bash 扩展。
  • 虽然 [[ ]](( )) 中的代码不需要双引号来防止 glob 扩展或字符串拆分,但应该在周围使用双引号在(几乎)所有其他情况下进行扩展。
  • sed '2 p'head -2 | 更有效地获取第 2 行 |尾-n 1.

但是,即使这样也比仅调用一次 git log 并迭代其结果效率低得多。

while IFS= read -r -u 3 last_commit; do
IFS=$'\n' read -r -d '' -a jira_id \
< <(grep -o -P '[A-Z]{2,}-\d+' <<<"$last_commit") ||:
[[ $jira_id ]] || continue
echo "Found ${#jira_id[@]} jira IDs"
printf ' %s\n' "${jira_id[@]}"
done 3< <(git log remotes/origin/devel --pretty=oneline --pretty=format:%s)

关于linux - Bash - 变量不在其他变量中计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31592474/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com