【问题标题】:Bash Script - String Split Paragraph Into SentencesBash 脚本 - 将字符串拆分为句子
【发布时间】:2014-04-23 06:05:59
【问题描述】:

我正在尝试编写一个 prepare-commit-msg git hook 脚本来检查最后 10 条提交消息的内容,并检查您尝试输入的消息是否是唯一的并阻止用户签入(没有 --no-verify 重载)如果它检测到它。当我在 Git 中运行这个命令行时,我得到以下输出。

dacke@MachineName /c/Development/Project(测试) $ git log --pretty=format:'%h|%an|%s' --max-count=10 2919dc2|Eric|测试消息 4ef580c|Eric|测试消息 1a0051b|Eric|测试消息 3e2df42|埃里克|测试提交 a08d4c1|Bob|DE6717 - 我做了什么来修复这个缺陷 aff8afc|Bob|DE6717 - 这是更多的缺陷信息 bbbfb67|Ralph|将分支“clean_up”合并到开发中 72d0968|Ralph|忘记从项目中删除已删除的类。 bfd1505|拉尔夫|清理。 d21c6dc|Bruce|将分支“图标”合并到开发中

我的 prepare-commit-msg 是这样写的。

1   #!/bin/bash
2
3   printf "Prepare-Commit-Msg Hook Running...\n"
4
5   #$1 = "Commit Message File 'COMMIT_EDITMSG'"
6   #$2 = "message"
7   commitMessage=$(cat "$1")
8  
9   #    Prevent people putting in the same commit message multiple times by looking for an identical message in the last 10 commits
10  declare -a last10CommitMessages
11  rawMessages=$(git log --pretty=format:'%h|%an|%s«' --max-count=10)
12  printf "Raw Messages Length: %d\n" "${#rawMessages[@]}"
13  for line in ${rawMessages//«/ };
14  do 
15  #printf "%s\n" $line
16  last10CommitMessages+=($line);
17  done
18  printf "Last 10 Commit Length: %d\n" "${#last10CommitMessages[@]}"
19 
20  # Temp exit 1 to prevent commit during testing
21  exit 1

当我尝试运行“提交”时,我得到以下输出。
原始消息长度:1 最后 10 次提交长度:63

如果我取消注释第 15 行,我可以看到对于每个空格和换行符,我都会将一个项目添加到数组中。最重要的是,我实际上想要分割线的字符被添加到末尾,这意味着我需要另一种方法来将其从末尾删除。

我是 bash 脚本的新手,我来自 C#/Windows 背景,所以我还在学习。有人可以为我提供一个简单的解决方案吗?对我来说,比快速回答更重要的是一个可以解释这实际上是如何工作的答案。我在网上发现了很多对我不起作用的相互矛盾的信息。我计划在弄清楚这一切之后写一篇关于这个的博客文章,所以重要的是我没有得到任何“它只是工作”作为答案。谢谢。

【问题讨论】:

    标签: string git bash split


    【解决方案1】:

    只需更改 rawMessages=$(git log --pretty=format:'%h|%an|%s«' --max-count=10)

    到这里

    rawMessages=($(git log --pretty=format:'%h|%an|%s«' --max-count=10))

    $( ) 计算内部命令并将其保存为一个字符串,忽略换行符。当你用 ( ) 包装一些东西时,它会将内容评估为一个数组。

    编辑:

    如果你这样做,你会发现数组中的元素比你想要的要多。这是因为数组将通过换行符和空格分割字符串。要忽略空格,您可以按照 hlovdal 的建议执行此操作..

    OLD_IFS="$IFS"
    IFS=$'\n'
    
    rawMessages=($(git log --pretty=format:'%h|%an|%s«' --max-count=10))
    
    IFS="$OLD_IFS"
    

    【讨论】:

      【解决方案2】:

      由于 IFS 变量(内部字段分隔符 - 一个古老的 unix 遗物...),其默认值 "<space><tab><newline>" 导致单词被拆分。将循环更改为

      oldIFS=$IFS
      IFS=«
      for line in ${rawMessages}
      do
              printf "%s\n" $line
              last10CommitMessages+=($line);
      done
      IFS=$oldIFS
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-30
        • 2021-11-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-26
        • 1970-01-01
        相关资源
        最近更新 更多