我正在阅读Bash 教程,特别是单词分裂的主题.
这个名为"args"的脚本有助于演示单词拆分示例:
#!/usr/bin/env bash
printf "%d args:" $#
printf " <%s>" "$@"
echo
Run Code Online (Sandbox Code Playgroud)
一个例子:
$ ./args hello world, here is "a string of text!"
5 args: <hello> <world,> <here> <is> <a string of text!>
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.我理解这是如何工作的.
但是,当我用非空白字符替换IFS时,:如果我直接将字符串作为参数传递,则脚本不会执行分词.
$ ./args one:two:three
1 args: <one:two:three>
Run Code Online (Sandbox Code Playgroud)
但是,如果I(1)将字符串分配给变量,然后(2)通过参数扩展将字符串传递给脚本,则脚本会对同一字符串执行分词.
$ IFS=:
$ variable="one:two:three"
$ ./args $variable
3 args: <one> <two> <three>
Run Code Online (Sandbox Code Playgroud)
为什么?具体来说,当IFS未设置且分隔符是空白字符时,为什么传递字符串作为参数会进行单词拆分,但是当IFS设置为非空白字符时却不会?
当我使用read而不是这个脚本时,相同的字符串也会按预期进行单词拆分.
$ IFS=:
$ read a b c
one:two:three
$ echo $a $b $c
one two …Run Code Online (Sandbox Code Playgroud) 我已经在几个地方阅读过此书,但并没有完全理解为什么。我理解为什么在MIPS32中所有指令必须字对齐到4个字节。
但是后来我读到堆栈帧必须是8的倍数,因为堆栈指针需要双字对齐。为什么?
我了解所附图像中的所有内容,但添加空白空间以将堆栈填充为8字节倍数的原因除外。
编辑:我在这里阅读本文的一个来源是第3页,项目符号4。另一个是过程调用示例下的Patterson和Hennessey的计算机组织与设计,第5版,附录A.6。但是,对我来说很明显,我现在误以为他们在谈论MIPS32。
我已经成功安装了 DrRacket 的 SICP 包;我通过使用incGUI 中的操作符对其进行了测试。我按照这里的说明进行操作。
但是,当我racket在 bash 中运行时,使用inc运算符会出现错误。
欢迎使用 Racket v6.6。
>(包括 42)
公司:未定义;无法引用未定义的标识符上下文...:/usr/share/racket/collects/racket/private/misc.rkt:88:7
显然,我没有正确安装它。那我该怎么办?
编辑 1:此外,对于 DrRacket 的 GUI 和bash ,1+和-1+运算符都会给出类似的错误。racket