Linux 更好的狂欢BASH和“BASH”;“令人发狂”;语法
一次更好的狂欢? 我对BASH非常缺乏经验,但最近我一直在使用它来执行我的程序代码,以便批量处理实验室中各种实验的数据 我已经使用C/C++多年了,所以我会把自己看作“相当胜任”的程序员。 。。。但在狂欢节上却不是这样 我意识到BASH(或至少SH或其前身)可能在1971年左右就已经存在,因此非常古老,因此可能有10^6+1个原因解释了语法为何如此(向后兼容性是其中之一),但是,今天我尝试这样做:Linux 更好的狂欢BASH和“BASH”;“令人发狂”;语法,linux,bash,syntax,Linux,Bash,Syntax,一次更好的狂欢? 我对BASH非常缺乏经验,但最近我一直在使用它来执行我的程序代码,以便批量处理实验室中各种实验的数据 我已经使用C/C++多年了,所以我会把自己看作“相当胜任”的程序员。 。。。但在狂欢节上却不是这样 我意识到BASH(或至少SH或其前身)可能在1971年左右就已经存在,因此非常古老,因此可能有10^6+1个原因解释了语法为何如此(向后兼容性是其中之一),但是,今天我尝试这样做: for DEPTH in {$START..$END} do ... done 这不起作
for DEPTH in {$START..$END}
do
...
done
这不起作用,因为在本例中,{$START..$END}
的计算结果为{9..9}
(字符串,而不是扩展名'9'
)
为了解决此问题,我必须执行以下操作:
for DEPTH in $(eval echo "{$START..$END}")
do
...
done
这是。。。嗯。。。奇怪的这比Matlab偶尔出现的毛茸茸的语法更重要。(我不认为这是一个太有争议的说法,我的假设是,任何使用像Fortran、C或Python(或任何其他语言)这样语法连贯的语言的人都可能会同意这真的不是很好。除此之外,要完成这么简单的任务,键入(IMO)太多了
我知道BASH现在支持类似C的语法:
for (( c=$START; c<=$END; c++ ))
for((c=$START;c首先,“奇怪的双括号”是你告诉bash你想做算术的方式。它们是let
的同义词,让你避免引用所有内容。如果你不使用(
。)
或let
,所有内容都只是字符串
但是您可以在其他地方使用(
…)
,而不仅仅是在循环中使用。您可以使用$(
…)
包含算术表达式的结果,或者只使用(
…)
(例如((x=y/2+3))
进行数学设置,而不使用任何输出(例如,if((y%2==0))
),以及等等
请注意,在算术上下文中,不必在变量上加上美元符号,它们将自动替换为数值
通过{
..}
进行的花括号扩展是一种未与核心POSIX语义很好集成的黑客攻击事件,很像!
的历史替换。特别是,大括号扩展发生在任何其他替换之前。因此给定{$foo..$bar}
,花括号扩展器将$foo
和$bar
视为文字字符串,而不是数字,因此它们不会触发范围扩展。当bash将$foo
扩展到其值时,花括号已经为时已晚
有很多其他语言,你可能会认为它优于BASH,这对于命令行脚本来说是很好的工作;这是Perl被发明的全部原因。现在,在大多数有BASH的系统中,你可以拥有它和Python和Ruby。BASH的主要优点仍然是“API”与“UI”相同。…您不必将shell命令转换为库或API调用。但是如果您正在做非常复杂的事情,您最好切换语言。
问题来自Bash试图包含来自csh
的功能:(如果您觉得Bash语法笨拙(我并不一定不同意你的观点),我想你会发现csh/tcsh更糟糕。它使一些简单的事情变得简单,但总的来说它的语法不那么连贯。强制性链接:zsh人喜欢zsh的原因之一,以及至少一些bash人(包括我自己)喜欢zsh的原因更喜欢bash是一回事:当旧的行为愚蠢时,zsh会破坏向后的兼容性。我所在的阵营认为,有时为了兼容性而做愚蠢的事情是值得的,但这肯定不是一成不变的。顺便说一句——字符串比较应该是=
,而不是=
,如果你想参与的话与POSIX兼容的习惯;==
是一个bash扩展。bash和C/C++使用不同的范例,所以这有点像是在问为什么Haskell/Prolog不让你增加变量。bash的评估模型更像是一个递归的单通道宏处理器。