【问题标题】:There are extra whitespaces produced by `echo` command`echo` 命令产生了额外的空格
【发布时间】:2018-12-07 13:55:04
【问题描述】:

环境:macOS 10.14

外壳:zsh

《Linux 命令行》一书中有几行代码

#!/bin/bash
while [[ -n $1 ]]; do
        if [[ -r $1 ]]; then
                max_word=
                max_len=0
                for i in $(strings $1); do
                        len=$(echo $i | wc -c)
                        if (( len > max_len )); then
                                max_len=$len
                                max_word=$i
                        fi
                done
                echo "$1: '$max_word' ($max_len characters)"
        fi
        shift
done

我用命令运行代码

hello hello

hello 是包含代码并且可执行的文件。程序很简单。但是,输出是:

hello: 'max_len=$len' (      13 characters)

您可以在左侧( 之后看到一些额外的空格。我不知道为什么,也没有通过谷歌得到任何解决方案。

【问题讨论】:

  • 您的 wc 版本在其输出左侧填充,max_len 的引用扩展保留。
  • 吹毛求疵 - 您可能在命令行上运行 zsh,但 shebang 在脚本中显示 bash。

标签: macos shell zsh


【解决方案1】:

为什么要产生额外的进程? len=${#i} 应该更有效地为您提供字符串的长度。

【讨论】:

    【解决方案2】:

    在 Linux 上不会发生,但我敢打赌 wc -c 在 Mac 上打印的是“13”而不是“13”。 解决的一种方法是改变

    len=$(echo $i | wc -c)
    

    len=($(echo $i | wc -c))
    

    此解决方法使用数组语法,“13”将被解释为一个数组,因此 bash 将解析“(13)”,给出一个 ["13"] 数组。 len 将包含一个数组,但当用作普通变量时,bash 将使用第一个元素,在这种情况下,wc -c 输出的剥离版本。

    【讨论】:

    • 这是一个糟糕的解决方法。根本不要使用wcwc 的特定实现输出不是问题。
    • 同意@paul-hodges 的建议。通常 wc 用于行,在这种情况下,我不确定是否有简单的 bash 解决方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多