如何使bash从字符串中评估IF [[]]?

时间:2016-05-06 15:28:24

标签: bash lambda

我正在努力创建一个" Lambda" style WHERE脚本。

我希望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 个答案:

答案 0 :(得分:1)

你很亲密。您只需要切换到标准POSIX [ $CMD ]即可。

使用[[ $CMD ]][ $CMD ]之间的主要区别在于,第一个具有较少的意外,您无需引用变量。这也意味着变量虽然是一个令牌,但不能像你正在尝试那样拥有整个表达式。 [ $CMD ]的工作方式与原始shell的工作方式相同,[只是一个命令,因此需要显式引用,以便将空格解释为一个参数。

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