我正在努力创建一个" 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
如何才能使[[]]中的位正确?
答案 0 :(得分:1)
你很亲密。您只需要切换到标准POSIX [ $CMD ]
即可。
使用[[ $CMD ]]
和[ $CMD ]
之间的主要区别在于,第一个具有较少的意外,您无需引用变量。这也意味着变量虽然是一个令牌,但不能像你正在尝试那样拥有整个表达式。 [ $CMD ]
的工作方式与原始shell的工作方式相同,[
只是一个命令,因此需要显式引用,以便将空格解释为一个参数。
[[ ...]]
和[ ..]
之间有一个relevant question about the differences