2016-05-06 30 views
0

我想创建一个“Lambda”风格的WHERE脚本。如何让bash从字符串中评估IF [[]]?

我希望lambdaWHERE采用管道输入并将其传递通过,如果满足条件后作为参数给出。像xargs一样,我使用{}来表示管道下方的内容。

我打电话给我:

ls -d EqAAL * | lambdaWHERE.sh -f {}/INFO_ACTIVETICK

我想通过它们是否包含一个名为INFO_ACTIVETICK

这里文件通过文件夹名称是脚本:

#!/bin/sh 
#set -x 

ARGS=$* 

while read i 
do 
     CMD=`echo $ARGS | sed 's/{}/'$i'/g'` 

     if [[ $CMD ]] 
     then 
       echo $i 
     fi 
done 

但是当我运行它神秘“-n”出现...

$ ls -d EqAAL* | /q/lambdaWHERE.sh -f {}/INFO_ACTIVETICK 
+ ARGS='-f {}/INFO_ACTIVETICK' 
+ read i 
++ echo -f '{}/INFO_ACTIVETICK' 
++ sed 's/{}/EqAAL-1m/g' 
+ CMD='-f EqAAL-1m/INFO_ACTIVETICK' 
+ [[ -n -f EqAAL-1m/INFO_ACTIVETICK ]] 
+ echo EqAAL-1m 
EqAAL-1m 
+ read i 

如何获得[[]]中的位是否正确?

回答

1

你非常接近。你只需要切换到标准的POSIX [ $CMD ],它会工作。

使用[[ $CMD ]][ $CMD ]之间的主要区别在于,第一个惊喜较少,而且不需要引用变量。这也意味着一个变量虽然是一个标记,并且不能像你正在尝试的那样在其中包含整个表达式。然而,[ $CMD ]与原始shell的作用方式相同,其中[仅仅是一个命令,因此需要明确的引号以便将空格作为一个参数进行解释。

有和[ ..]一个relevant question about the differences之间[[ ...]]

+0

但要意识到,这样做将使** **不可能使用需要嵌入空格,水珠等等,因为它们会被shell扩展条件语句。 –

+0

太好了。这完全符合我的愿望 - 谢谢 – ManInMoon

+0

@EtanReisner你可以通过引用和转义来解决这个问题。 – Sylwester