【问题标题】:How to format a string in bash shell?如何在 bash shell 中格式化字符串?
【发布时间】:2014-06-26 19:02:31
【问题描述】:

我正在尝试在 linux 中格式化一个变量

str="Initial Value = 168" 
echo "New Value=$(echo $str|  cut -d '=' -f2);">>test.txt

我期待以下输出

Value = 168;

而是得到

Value = 168 ^M;

【问题讨论】:

  • 您的意见是什么?请将输入和命令分开。
  • 对于更复杂的格式,请尝试printf shell 命令。 (而且 ^M 是 CR,所以你有一些奇怪的换行符。)
  • 我输入的字符串值为“初始值=168”
  • 可能是您的输入字符串有一个 CR+LF 而不是只有 LF 吗?如果您的 sn-p 在文件中,则您的编辑器可能使用了错误的换行符。在这种情况下,字符串 "...168" 被解释为最后以 结尾的文本。
  • 我在回显到文件之前尝试格式化

标签: linux bash shell


【解决方案1】:

不要在 DOS 或 Windows 上编辑 bash 脚本。您可以在 bash 脚本上运行 dos2unix。问题是 Windows 使用“\r\n”作为行分隔符,Linux 使用“\n”。您也可以在 Linux 的编辑器中手动删除“\r”字符。

【讨论】:

    【解决方案2】:
    str="Initial Value = 168"
    newstr="${str##* }"
    echo "$newstr"  # 168
    

    模式匹配是要走的路。

    【讨论】:

      【解决方案3】:

      试试这个:

      #! /bin/bash
      
      str="Initial Value = 168"
      
      awk '{print $2"="$4}' <<< $str > test.txt
      

      输出:

      cat test.txt
      Value=168
      

      我有评论说它没有解决 ^M,我实际上这样做了:

      echo -e 'Initial Value = 168 \r' | cat -A 
      Initial Value = 168 ^M$
      

      awk之后:

      echo -e 'Initial Value = 168 \r' | awk '{print $2"="$4}' | cat -A
      Value=168$
      

      【讨论】:

        【解决方案4】:

        首先,总是引用你的变量。

        #!/bin/bash
        
        str="Initial Value = 168"
        echo "New Value=$(echo "$str" | cut -d '=' -f2);"
        

        对我来说,这会导致输出:

        New Value= 168;
        

        如果您在数字和分号之间出现回车,那么您的echo 可能有问题,或者您的输入数据可能不是您认为的那样。也许您正在 Windows 机器上编辑您的脚本并将其复制回来,而您的变量赋值正在获得 DOS 样式的换行符。根据您在问题中提供的信息,我无法判断。

        无论如何,我不会这样做。我会使用printf

        #!/bin/bash
        
        str="Initial Value = 168"
        value=${str##*=}
        printf "New Value=%d;\n" "$value"
        

        printf 的输出是可预测的,当您不想要它时,它会轻松去除像空白一样的垃圾。

        注意替换您的cut。 bash 内置函数的功能记录在“参数扩展”下的 Bash 手册页中,如果您想查找它。我在此处包含的替换精确与您在问题中获得的功能不同,但在功能上与您提供的示例数据相同。

        【讨论】:

        • 推荐 echo | cut 而不是 bash 内置函数(例如参数扩展或读取)有点不幸。
        • @CharlesDuffy - 已修复。想得到答案,然后清理它。 :)
        猜你喜欢
        • 2013-04-08
        • 2022-01-12
        • 2020-07-15
        • 1970-01-01
        • 2010-12-01
        • 1970-01-01
        • 2014-03-08
        • 2023-04-02
        • 2011-09-19
        相关资源
        最近更新 更多