grep在使用变量时不在脚本内部工作

时间:2017-04-20 08:48:34

标签: shell

我将demo.csv文件作为

html, body, .container, .sidebar, .content {
  min-height: 100%;
}

我正在编写一个脚本demo.ksh来过滤掉数据

data1,text1,text01  
data2,text2,text02  
data3,text3,text03  
data4,text4,text04  
data5,text5,text05  
data6,text6,text06  
data7,text7,text07  
data8,text8,text08  
data9,text9,text09  

demo.ksh和data.csv在同一个dir.demo.ksh中有+ x权限。当我运行demo.ksh为

#!/bin/ksh
while [[ $1 = -* ]]
do
    case $1 in
        --data)
            shift
            ARGS="$ARGS -e \"$1\""
        ;;
        --excl)
            ARGS="-v $ARGS"
        ;;
    esac
    shift
done
echo "grep $ARGS data.csv > test.txt"   
grep $ARGS data.csv > test.txt 

输出: demo.ksh --data data3 < - 由于脚本中的回声

test.txt是空白文件(?不知道为什么) 如果由于demo.ksh中的echo而复制打印在控制台上的命令,并直接粘贴到控制台上并点击回车。它运行正常并生成test.txt为

demo.ksh --data data3

为什么它不起作用。我在shellcript中错过了某些东西或以错误的方式执行grep

1 个答案:

答案 0 :(得分:0)

-v开关否定了所有内容,而不仅仅是下一个字符串。重复-v个开关就像单个-v开关一样。将-v开关添加到$ARG不能对一个字符串进行局部否定,除非巧合。

由于$ARGS不能包含正正则表达式和否定正则表达式的混合,因此请考虑使用两个单独的输入文件来保存搜索字符串:

#!/bin/ksh
pos=`mktemp`
neg=`mktemp`
while [ "$1" ]
do
    case $1 in
        --data)
            shift
            echo "$1" >> $pos
        ;;
        --excl)
            shift
            echo "$1" >> $neg
        ;;
    esac
    shift
done
grep -f $pos data.csv | grep -v -f $neg > test.txt
rm $pos $neg

请注意demo.ksh的语法保持不变,但语法不是很好,因为任何没有前面的--excl--data的搜索字符串或文件名都会丢失。