这是我对这个问题的评论之一,关于bc在 shell 脚本中的使用。 bc大量换行,例如:
> num=$(echo 6^6^3 | bc)
> echo $num
12041208676482351082020900568572834033367326934574532243581212211450\ 20555710636789704085475234591191603986789604949502079328192358826561\ 895781636115334656050057189523456
Run Code Online (Sandbox Code Playgroud)
但是请注意,它们并不是变量中的真正换行符——或者至少如果不加引号使用的话,它们就不是换行符。例如,在分配中使用更多管道进行鬼混,例如:
num=$(echo 6^6^3 | bc | perl -pne 's/\\\n//g')
Run Code Online (Sandbox Code Playgroud)
我意识到,虽然确实是一个\n在bc输出,检查echo $num > tmp.txt与hexdump示出了\n(ASCII 10)具有绝对成为变量赋值的空间(ASCII 32)。
或者至少,在 unquoted 的输出中$num >。这是为什么?
正如 fedorqui 指出的那样,如果您使用引号: echo "$num",您将再次获得换行符。通过检查hexdumpecho $num > tmp.1和echo "$num" > tmp.2hexdump之间的区别,这一点很明显;前者包含\(反斜杠空格)而后者包含\\n(反斜杠换行符)。
不知道为什么它在那里,但这里是如何使用 GNU 实现禁用它bc:
echo '6^6^3' | BC_LINE_LENGTH=0 bc
Run Code Online (Sandbox Code Playgroud)
BC_LINE_LENGTH
这应该是一个整数,用于指定数字输出行中的字符数。这包括长数字的反斜杠和换行符。作为扩展,零值禁用多行功能。此变量的任何其他小于 3 的值都将行长度设置为 70。
我对这个问题感到困惑,我认为这是关于多线功能的起源,它看起来确实很奇怪。无论如何,真正的答案是,如果您不引用该变量,shell 将在将其传递给echo. 分词是根据 的内容将扩展拆分为“词”的过程,IFS然后这些“词”成为不同的参数。在问题示例中,这为 echo 创建了两个参数,echo然后用空格分隔(我在 Stephane 评论之前就知道这一点,老实说......)。
为了防止这种情况发生,只需双引号变量:
num=$(echo '6^6^3' | bc)
echo "$num"
Run Code Online (Sandbox Code Playgroud)
有时这实际上是一种从变量中删除 IFS 字符的方法(尽管printf %s对于任意字符串更安全)。例如(在bash):
$ var=$'spaces: newlines:\n\n\ntabs:\t\t\t end'
$ echo "$var"
spaces: newlines:
tabs: end
$ newvar="$(printf '%s ' $var)"
$ echo "$newvar"
spaces: newlines: tabs: end
Run Code Online (Sandbox Code Playgroud)
echo在每两个参数之间放置一个空格。shell 将换行符视为$num单词分隔符(就像空格一样)。
lines="a
b
c"
set -x
echo $lines # several arguments to echo
echo "$lines" # one argument to echo
Run Code Online (Sandbox Code Playgroud)
有关更详细的解释,请参阅此答案(OP 本人)。
| 归档时间: |
|
| 查看次数: |
785 次 |
| 最近记录: |