Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.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
Regex Bash:[[]]vs(())in=~表达式for";如果是“那么”;剧本还有=~^_Regex_Bash_If Statement_Arithmetic Expressions - Fatal编程技术网

Regex Bash:[[]]vs(())in=~表达式for";如果是“那么”;剧本还有=~^

Regex Bash:[[]]vs(())in=~表达式for";如果是“那么”;剧本还有=~^,regex,bash,if-statement,arithmetic-expressions,Regex,Bash,If Statement,Arithmetic Expressions,在中,=~运算符列在[[expression]]下,对于表达式,我应该使用闭括号。这也是一个公认的答案: (需要双方括号)“因为=~是[[expression]]复合命令的运算符。” 但是,我的脚本行=~在闭括号中失败,而在开括号中运行。我想知道Bash在开括号和闭括号情况下都在做什么,以便更好地理解它们是如何工作的 上下文 我想将文件从$R/x/传输到ppc/,其中$R是指30个目录的数字,它们的标签范围为2.0到5.0,增量为0.1 x/是$R内的通用子目录标签 每隔5个目录,即:(2.0

在中,=~运算符列在[[expression]]下,对于表达式,我应该使用闭括号。这也是一个公认的答案:

(需要双方括号)“因为
=~
[[expression]]
复合命令的运算符。”

但是,我的脚本行
=~
在闭括号中失败,而在开括号中运行。我想知道Bash在开括号和闭括号情况下都在做什么,以便更好地理解它们是如何工作的


上下文 我想将文件从
$R/x/
传输到
ppc/
,其中
$R
是指30个目录的数字,它们的标签范围为2.0到5.0,增量为0.1

x/
是$R内的通用子目录标签

每隔5个目录,即:(2.0、2.5、3.0、3.5、4.0、4.5、5.0)我需要附加一个条件,使脚本仅从
x/
中提取特定文件,并将其余文件留在后面。这些文件都以105开头,并使用
$R/x/105*
提取

我的脚本如下所示:

#!/bin/bash
#

for (( i=0;i<=30; i++ )) ;

do

R=$(echo "scale=2;2.0+0.1*$i" |bc -l)
#$R specifies a number corresponding to the directory I need

if (( $R =~ ^(2.0|2.5|3.0|3.5|4.0|4.5|5.0)$ )) ;
#This line is important. My question relates solely to this line.

then

cp -r $R/ ppc/

else

mkdir ppc/$R/ &&
mkdir ppc/$R/x &&

cp -r $R/x/105* ppc/$R/x
fi

done
但是/ppc中的最终输出结果正是我想要的。我将所有30个目录从$R=2.0转移到$R=5.0,每五个目录我就有选择地提取特定的文件


但是,如果我将“如果”条件更改为:

if [[ $R =~ ^(2.0|2.5|3.0|3.5|4.0|4.5|5.0)$ ]] ;
   ^^                                       ^^
即闭括号,我得到零错误消息;然而,如果没有算术,我的输出结果就糟透了。输出就像我的脚本完全没有if/then条件:

#!/bin/bash
#

for (( i=0;i<=30; i++ )) ;

do

R=$(echo "scale=2;2.0+0.1*$i" |bc -l)

cp -r $R/ ppc/

done

rm -r ppc/2.0/
#/bin/bash
#

对于((i=0;使用
=~
的iRegex求值仅在
[…]]
中受支持,即使您的正则表达式不完全正确,它也应该适用于
for
循环中给定的
i
范围。我建议花一些时间阅读手册页。
(…)
是一个仅用于算术表达式的命令。
^
后面的
=~
只是正则表达式中字符串锚点的开始。如果
后面的标记是一个命令,并且如果命令成功(即,如果它的返回值为零),则等同于True。括号,
[
((
[
都是不同的命令。
[
主要用于文本模式匹配,
用于算术。
[
是旧的Bourne shell
test
命令。请一次只问一件事。请阅读有关如何在堆栈溢出问题上提问的页面。谢谢您的回答。@anubhava我理解=~是用于[[…]的。这就是为什么我很好奇(…)工作。&切普纳感谢您对^的澄清;我想可能是这样。如前所述,我知道(…)仅适用于算术表达式。为什么它适用于操作员?手册中明确指出的是[…]]?&cdarke我的脚本按我所能理解的方式运行?这让我很困惑,因为手册中指出=~用于匹配表达式,而不是相反。你知道它为什么工作吗!~?使用
=~
的正则表达式求值仅在
[…]中受支持
即使您的正则表达式不完全正确,它也应该适用于
for
循环中给定的
i
范围。我建议花些时间阅读手册页。
(…)
是一个仅用于算术表达式的命令。
^
后面的
=~
只是正则表达式中字符串锚点的开始。如果
后面的标记是一个命令,并且如果命令成功(即,如果它的返回值为零),则等同于True。括号,
[
((
[
都是不同的命令。
[
主要用于文本模式匹配,
用于算术。
[
是旧的Bourne shell
test
命令。请一次只问一件事。请阅读有关如何在堆栈溢出问题上提问的页面。谢谢您的回答。@anubhava我理解=~是用于[[…]的。这就是为什么我很好奇(…)工作。&切普纳感谢您对^的澄清;我想可能是这样。如前所述,我知道(…)仅适用于算术表达式。为什么它适用于操作员?手册中明确指出的是[…]]?&cdarke我的脚本按我所能理解的方式运行?这让我很困惑,因为手册指出=~用于匹配表达式,而不是相反。你知道为什么它按!~?
#!/bin/bash
#

for (( i=0;i<=30; i++ )) ;

do

R=$(echo "scale=2;2.0+0.1*$i" |bc -l)

cp -r $R/ ppc/

done

rm -r ppc/2.0/