1

这是显示问题的代码:

#!/bin/bash

function char() {
    local char="$(echo $1 | cut -c2)"    # Gets second character from argument.
    echo $char
}

char -a                                  # Outputs 'a'.
char -e                                  # Or 'char -n' outputs nothing.

我希望这段代码输出 ['a', 'e'] 而不是 ['a', nothing]。

我认为问题在于echo $1。我的问题有点类似于这个。但似乎大多数解决方案都不适合我。我认为 Bash 从那个问题的版本中改变了它的行为:'3.00.15(1)-release (x86_64-redhat-linux-gnu)'。

我的 Bash 版本是“4.3.30(1)-release (i586-pc-linux-gnu)”。我努力了:

echo x-e                                 # Outputs 'x-e'.
echo -- -e                               # Outputs '-- -e'.
echo "-e "                               # Outputs '-e'.

唯一有效的“hack”是echo "$1"。但我有一种感觉,这不是最好的做法。

PS我个人觉得这很有趣。感谢您对此的任何想法。

4

1 回答 1

1

-e是一些echo解释版本的标志。这里的解决方案是不要使用echo,而是使用printf

printf '%s' "$1" | cut -c2

help echobash 中:

Options:
 -n        do not append a newline
 -e        enable interpretation of the following backslash escapes
 -E        explicitly suppress interpretation of backslash escapes

因此,当变量扩展并且您尝试运行echo -e时,它不会回显-e它告诉echo使反斜杠表示转义序列的字符串。

要深入讨论为什么 printf 比 echo 更好,请阅读那里的优秀答案。

如果您尝试在此处处理命令行选项,您可能会考虑其他方法。喜欢getopts在这里阅读一些很棒的选择

于 2017-08-08T11:07:07.100 回答