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