Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 更好的狂欢BASH和“BASH”;“令人发狂”;语法_Linux_Bash_Syntax - Fatal编程技术网

Linux 更好的狂欢BASH和“BASH”;“令人发狂”;语法

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 这不起作

一次更好的狂欢?

我对BASH非常缺乏经验,但最近我一直在使用它来执行我的程序代码,以便批量处理实验室中各种实验的数据

我已经使用C/C++多年了,所以我会把自己看作“相当胜任”的程序员。 。。。但在狂欢节上却不是这样

我意识到BASH(或至少SH或其前身)可能在1971年左右就已经存在,因此非常古老,因此可能有10^6+1个原因解释了语法为何如此(向后兼容性是其中之一),但是,今天我尝试这样做:

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的评估模型更像是一个递归的单通道宏处理器。