2016-05-06 63 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