如何在函数末尾打印新行?

如何在函数末尾打印新行?

如果我输入echo hello,我的终端将如下所示:

My-Computer:~ user$ echo hello
hello
My-Computer:~ user$ 

但如果我有这样的功能

stringen () { cat /dev/urandom | env LC_CTYPE=C tr -cd 'a-Z-A-z-0-9' | head -c "$1" ; }

看起来像这样

My-Computer:~ user$ stringen 18
^\k6JPWVIUdEiudcWSMy-Computer:~ user$ 

看到它没有在新行中打印吗?使用printfvs时同样如此echo。我怎样才能让我的函数创建这样的新行?我以为他们;会解决这个问题,但显然不会。

例如,这返回我想要的

variable=$(stringen 18)
echo $variable

是有回声的东西吗?

答案1

, cat,tr或都不head添加换行符(urandom可以,但它是随机的,所以我不相信它)。您必须手动插入新行,并printf '\n'在函数末尾添加 a 或echo.

顺便说一句,有些 shell 确实添加了它,例如zsh,以防止此类情况。

答案2

你的函数是否打印换行符一点也不重要。命令替换如果有的话将删除它们。

Bash 通过执行命令并将命令替换替换为命令的标准输出来执行扩展,删除所有尾随换行符。 (强调我的)

testfunc() { echo hello; }    # a newline is printed
output=$(testfunc)            # $output does NOT contain a trailing newline
echo "$output"                # echo adds a newline
printf "%s" "$output"         # no newline

答案3

恕我直言,这可能部分地echo问题的另一部分是影响力。因此,理想的情况是如果您的发行版最近发布了GNU版本tr(就像我的),因为正如你在下面看到的,你的语法中有一个明显的怪癖,GNUtr抱怨告诉你必须在哪里应用“修复”。

原来的:

$ stringen() { cat /dev/urandom | env LC_CTYPE=C tr -cd 'a-Z-A-z-0-9' | head -c "$1" ; }

$ stringen 18
tr: range-endpoints of 'a-Z' are in reverse collating sequence order

哎哟!这是您的线路的替代版本,它修复了它(至少在我的GNU 发行版tr就成功了):

“固定的”:

$ stringen () { cat /dev/urandom | env LC_CTYPE=C tr -cd 'A-Za-z0-9' | head -c "$1" ; }
$ stringen 18
V068BrYGKIICyLI4QB
$ 

结论:最好不要将集合与 混合使用tr,但是在组合集合/范围时,始终确保保持大字母对大字母,小字母对小字母。

然而:对于非 GNU tr,缺少换行符的问题可能仍然存在。但对于 GNU 来说,我修正后的行将不再需要任何花哨的换行技巧。

答案4

您不需要变量来保存此输出。直接简单的echo输出:

echo "$(stringen 18)"

相关内容