【问题标题】:Bash scripting: List of folders in a variable and grep the exact directory nameBash 脚本:变量中的文件夹列表和 grep 确切的目录名称
【发布时间】:2011-10-22 08:26:15
【问题描述】:

这是我的问题。获取文件 GC.xml 所在的目录列表:

EXBRANDS=find /var/www/html/ -maxdepth 3 -name "GC.xml" -type f | awk -F '/' '{打印 $5}';

#echo $EXBRANDS

#dir1 dir2 dir3 (it appears exactly like this)

#read var

例如输入“目录”

这就是我无法确定我输入的确切模式以将其与我的目录列表进行比较的地方。

echo $EXBRANDS | grep "[ $var]\|[$var ]\|[ $var]" if [[ $? -eq 0 ]] ; then ..... else ..... fi;

我认为我的 grep 命令有问题,好像我将值“dir”传递给 $var 我的 grep 命令实际上找到了目录并返回 $?=0

我的愿望是只有在我的 grep 命令中准确找到模式 $var 时才能获得 $?=0...

这里最好的 grep (egrep) 选项是什么?还是我的方法完全愚蠢?

【问题讨论】:

    标签: bash directory grep


    【解决方案1】:

    您的EXBRANDS 包含许多行,而您使用 echo 使这些行松散。

    我会这样做:

    read var
    find /var/www/html/ -maxdepth 3 -name "GC.xml" -type f | awk -F '/' '{print $5}' | grep "^$var\$"
    if [[ $? -eq 0 ]] ; then ...  else ... fi;
    

    确保 grep 与 "^$var\$" 构造完全匹配。

    编辑:你也可以printf "$EXBRANDS" | grep "^$var\$"代替echo,它可能会解决你的问题。

    【讨论】:

    • 这有效,但前提是您不需要该格式的 EXBRANDS;使用 EXBRANDS=‘find ...‘ 将所有内容放在同一行:“dir1 dir2 dir3”
    • 你确定它在同一行吗?如果您执行echo $EXBRANDS,它将出现在同一行,因为shell 替换发生在参数解析之前,并且由于参数的分隔符是空格、制表符和换行符,因此您可以在一行中获得所有内容。试试echo "$EXBRANDS",它将向echocat << EOF <new line> $EXBRANDS <new line> EOF 发送一个参数。
    【解决方案2】:

    尝试使用单词边界:

    if [ ! -z "$var" ] ;  
        then echo $EXBRANDS | grep -e "\b$var\b"; 
        if [[ $? -eq 0 ]] ; 
            then echo "Y"; 
            else echo "N"; 
        fi;
        else echo "input dir must be not null"; 
    fi;
    

    编辑:添加空检查

    【讨论】:

    • 好的,解决了这个问题,但是如果我为 $var 按 Enter 键,它似乎认为 $?=0... 我怎样才能摆脱这种情况?
    • 只需在 $var 上添加一些验证,然后再继续执行,因为我认为在空字符串上运行以下代码没有意义。即,使用 if [ -z "$var" ] 进行测试,如果为 true 则优雅退出并报错
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-25
    • 2015-08-02
    • 1970-01-01
    • 1970-01-01
    • 2022-11-18
    相关资源
    最近更新 更多