【问题标题】:How to obtain the first letter in a Bash variable?如何获取 Bash 变量中的第一个字母?
【发布时间】:2012-04-30 09:37:05
【问题描述】:

我有一个 Bash 变量 $word,它有时是一个单词或句子,例如:

word="tiger"

或者:

word="This is a sentence."

如何创建一个新的 Bash 变量,它只等于变量中的第一个字母?例如,上面将是:

echo $firstletter
t

或者:

echo $firstletter
T

【问题讨论】:

    标签: bash text-processing variable-expansion


    【解决方案1】:
    initial="$(echo $word | head -c 1)"
    

    每当您在问题描述中说“第一个”时,head 就是一个可能的解决方案。

    【讨论】:

    • 请注意,POSIX head 中没有-c 选项:unix.com/man-page/posix/1/head>。
    • 这确实返回了第一个字母,但它是一个矫枉过正,解决方案取决于外部实用程序(头)。这可以在纯shell中完成,更干净。
    • 由于上述 cmets 指出的原因,这不应该是公认的答案。真正的答案如下 - ${word:0:1}${word::1}
    • 对于 POSIX 合规性,您可以执行 echo "$word" | fold -w1 | head -n 1printf '%.1s' "$X"printf '%c' "$X",但这些都受单字节和多字节字符恶作剧的影响。
    • 等等,head -c n 也是,哎呀。 echo "fábio" | head -c 2 给了f� ,所以我猜这是另一个问题。
    【解决方案2】:
    word="tiger"
    firstletter=${word:0:1}
    

    【讨论】:

    • 正是我想要的。单线,不产生子壳。投我一票!
    【解决方案3】:
    word=something
    first=${word::1}
    

    【讨论】:

    • 这很好,但对我不起作用,无论是在 bash 4.3.11 还是在 zsh 5.0.5 中
    • 在 GNU bash v4.3.11 中,first 设置为字母 s。您可以通过echo $s 看到它。如果这对您不起作用,并且您需要帮助调试,请复制并粘贴您键入的命令及其输出。
    • 谢谢亚当,我的错,我不知道为什么它以前对我不起作用,但现在它在我尝试的几个版本的 bash 上工作得很好,回到 GNU bash, v3.1.0。在 zsh 中仍然不起作用,但问题被标记为“bash”,所以这无关紧要。
    • 感谢您的关注和确认!很高兴它对你有用。
    • 对于 zsh 用户:它与 ${word:0:1} 合作
    【解决方案4】:

    因为你有一个sed 标签,这里是一个sed 答案:

    echo "$word" | sed -e "{ s/^\(.\).*/\1/ ; q }"
    

    为那些喜欢这些的人玩玩玩(我愿意!):

    {

    • s: 启动替换例程
      • /:开始指定要替换的内容
      • ^\(.\):捕获第 1 组中的第一个字符
      • .*:,请确保该行的其余部分将在替换中
      • /:开始指定替换
      • \1:插入组 1
      • /:剩下的就弃了;
    • q:退出sed,这样它就不会为其他行重复此块(如果有的话)。

    }

    那很有趣! :) 您也可以使用grep 等,但如果您在bash 中,${x:0:1} magick 仍然是 imo 更好的解决方案。 (我花了大约一个小时尝试使用 POSIX 变量扩展来做到这一点,但不能:(

    【讨论】:

      【解决方案5】:

      一种可移植的方法是使用parameter expansion (which is a POSIX feature)

      $ word='tiger'
      $ echo "${word%"${word#?}"}"
      t
      

      【讨论】:

      • :: 的其他答案更合理,但我不能错过支持这种滥用扩展的做法。做得很好。
      • 这是经常需要在脚本环境中执行的情况,即 POSIX sh,而不是 bash(尽管这不是问题)
      【解决方案6】:

      使用 bash 4:

      x="test"
      read -N 1 var <<< "${x}"
      echo "${var}"
      

      【讨论】:

        【解决方案7】:

        带切:

        word='tiger'
        echo "${word}" | cut -c 1
        

        【讨论】:

          猜你喜欢
          • 2013-07-17
          • 2013-12-13
          • 2021-04-24
          • 2013-02-07
          • 1970-01-01
          • 2016-11-25
          • 2018-12-19
          • 1970-01-01
          相关资源
          最近更新 更多