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
为什么变量后边必须直接跟"=",不能有空格呢,为什么"="后边也不能有空格呢,有空格会直接当成命令执行
7294 次点击
所在节点    Linux
30 条回复
Orzzzz
2015-12-02 23:28:15 +08:00
@workwonder Bash Python 两手抓~
Orzzzz
2015-12-02 23:29:06 +08:00
@ivito 除了处理日常事务,还有最经典的 fork 炸弹 :P
dcoder
2015-12-03 00:33:48 +08:00
@ivito 简单说就是, bash 是一门烂语言
总是有很多烂工具,因为各种历史原因,一直没废除了,不停虐新的程序员, 比如超复杂的 MakeFile...
weyou
2015-12-03 02:27:13 +08:00
@lululau 反例举的很好,赞一个。
iptux
2015-12-03 02:45:59 +08:00
bash 本身并不怎么强,它强在可以迅速调用其他命令并把这些命令串起来
zent00
2015-12-03 08:31:00 +08:00
@dcoder Bash 原本并不是以一门语言而被写出来的,而是一个 Unix Shell 。虽然现在能见到的大多数 Shell 都有一些可编程特性,但肯定不能把它和那些“高级编程语言”做对比。如果说 Python 和 Perl 这些脚本语言比 Bash 强多了,那么,请试试把它们作为操作系统的 Shell 来使用看看。
Arthur2e5
2015-12-03 11:44:14 +08:00
因为 shell 语法的 word 单元这么做就是简单容易。况且这么做完全就是福利懒人,我还可以一行写好多个:

> t=$b b=$a a=$t g=$(echo 233)

并且人类的确就是有“对某个命令带着某一堆限定作用域的特殊环境运行( simple_command ::= ASSIGNMENT_WORD* cmd_word cmd_args*)” 的 shorthand 的需求。你可以找个一下子能定义多个的、显而易见的、和变量定义形式一致的这种语法试试……

你是喜欢
> ( # create separated environment
> set -o allexport
> CC = gcc
> CXX = g++
> ./configure
> )

还是
> CC=gcc CXX=g++ ./configure

你再考虑一下你这样的语法要加多少限制和惊喜,例如符合变量名要求开头的命令的参数里面里面不能有未 escape 的 = 之类的。

P.S. 关于敲键盘,记得有人吐槽说 dd 这种“出自按键重得按了可能骨折的时代”,倒是没考证过。
ivito
2015-12-04 13:24:08 +08:00
@Arthur2e5
这种写法确实带来很多便利
( simple_command ::= ASSIGNMENT_WORD* cmd_word cmd_args*)
这个是正则吧,两个":"是什么意思。
meloncrashed
2015-12-04 15:11:53 +08:00
@bramblex 这个例子好棒
meloncrashed
2015-12-04 15:16:53 +08:00
bash 现用现看吧, bash 是个命令胶水,串联命令用用 bash 。

反正我学 python, bash 忘得差不多了。

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

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

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

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

© 2021 V2EX