Linux shell 赋值语句为什么不能有空格

2015-12-02 17:31:45 +08:00
 ivito
比如
a='haha' # ok
a = 'haha' # not ok
a= 'haha' # not ok

再比如

a=$(echo 'aaa\n bbb' | grep aaa ) # ok
a= $(echo 'aaa\n bbb' | grep aaa ) # not ok
为什么变量后边必须直接跟"=",不能有空格呢,为什么"="后边也不能有空格呢,有空格会直接当成命令执行
7292 次点击
所在节点    Linux
30 条回复
surfire91
2015-12-02 17:36:28 +08:00
语法就是这么设计的,这个解释你满意吗?
superhxnju
2015-12-02 17:40:24 +08:00
有空格,会认为是命令
ivito
2015-12-02 17:41:44 +08:00
@surfire91 我是想搞明白为什么这么设计,我们都知道 c 语言是忽略空格的, shell 这么设计从语法层面是如何造成的,不忽略空格这一事实从设计方面又是怎么考虑的
SpicyCat
2015-12-02 17:57:43 +08:00
http://tldp.org/LDP/abs/html/gotchas.html#WSBAD
如果赋值语句有空格,那就会被认为是执行命令并带两个参数。
workwonder
2015-12-02 19:53:29 +08:00
我曾经也执着地写 shell 脚本,但实际上真虐心!
bash 的表达能力太弱,建议还是选其它顺手的语言写命令行脚本。
lululau
2015-12-02 20:52:15 +08:00
比如我有两个文件,一个叫“=”,一个叫“ abc ”
那么我要将这两个文件的内容拼接到一起,那么我用这个命令:

cat = 123

按照你的设想,这不就成了个赋值语句了吗

第二个问题,是因为 var=value command 这个形式在 bash/zsh 里表示执行 command 程序,并为执行此程序的进程添加一个环境变量 var ,其值为 value

如果你把赋值语句写成: var= 123 ,那么它的意思就是执行 123 这个程序,并为此进程设置一个环境变量 var ,其值为空字符串
lululau
2015-12-02 20:56:16 +08:00
因为 bash 的功能设施比较简单,所以我建议,如果是已经掌握了基本的命令的使用的话,直接看 manual 就行了,总共不到 4 万字,看完基本就是 bash 熟手了
sinxccc
2015-12-02 21:34:49 +08:00
因为 shell 既作为脚本的解释器,又用做交互的用途。
xufang
2015-12-02 21:37:51 +08:00
最近一年都在写 shell , 要吐血哦。
bramblex
2015-12-02 21:38:53 +08:00
举个栗子:
「我们中出了叛徒」你要理解成 「我们中 /出了叛徒」还是理解成「我们 /中出了 /叛徒」?
workwonder
2015-12-02 21:57:04 +08:00
@xufang 我是主动放弃了 shell 技能,能用 shell 写的也用 python 写,这样脚本复杂之后还能轻松维护。
xufang
2015-12-02 21:58:40 +08:00
@workwonder 嗯, bash 的表达能力和复用度太低,写得我不要不要的。
xufang
2015-12-02 21:59:50 +08:00
哦,我之前还写过半年的批处理,哇,那可真是地狱难度。
yangff
2015-12-02 22:03:45 +08:00
@xufang windows 下对应 shell 的理论应该是 vbs/powershell ……
lightening
2015-12-02 22:05:31 +08:00
@ivito 但是 C 语言调用函数是必须要有括号的。 bash 每个命令都加个括号,用起来烦不烦啊?
Orzzzz
2015-12-02 22:11:23 +08:00
@workwonder 没感觉弱啊,要不举个例子说说?
xufang
2015-12-02 22:11:39 +08:00
ivito
2015-12-02 22:44:04 +08:00
@SpicyCat
@lululau
两位的解释很充分,感谢
workwonder
2015-12-02 22:45:52 +08:00
@Orzzzz 这个不用例子了吧,像 python 这类脚本语言在运维领域也很火的,自然有道理的。
bash 由于本身很简单,好上手,极简单的任务用它来写来的很快,但是任务复杂后慢慢就驾驭不了了,一些其它编程语言基础的特性你还得组合各种工具利用各种技巧实现。
实践上我们写的最多的 shell 脚本是用来完成构建和发布任务的,后来用基于 python 的 fabric 来做这些事情,轻松许多,功能也强大许多。请自行了解 fabric 。
另外 npm 有一个 shell.js 的模块,实现了许多常用命令行工具的功能,让你可以以 JavaScript 的方式调用它们,不妨去了解下。
ivito
2015-12-02 22:46:55 +08:00
@xufang
@workwonder
个人觉得 bash 还是很方便的,比如处理文本,直接一两个命令,而 Python 则需要好几倍的代码。
bash 配合 awk 、 sed 等神奇用起来表达能力很强的,补足了 bash 数据结构太少的缺点,况且还有很多不常用的命令作为补充。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/240639

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX