bashrc argv转义空间

时间:2013-12-25 18:55:47

标签: bash unix

我正在开发一个小的bashrc函数,它将通过du ... grep> = 10MB大小的文件/目录...

但是,我有一些如何逃避空间的问题。即使在尝试使用$1转义它时,\似乎也会在空格处中断。

我也试过在bashrc文件中说:

du -sch "$1"

du -sch $1

du -sch '$1'

du -sch $@

  • 但即使在输入时逃脱,它仍然在空间中断。

bashrc条目:

dubig() { # greps after >= 10MB size in $DIR, else runs regular du -sch $DIR
if [ ! -z $1 ] ; then
    RE="(^[0-9]{2,}(M|\..*M$)|^[0-9]{1,}(G|\..*G$))";
    NM="-e \t- - No matches, printing normal output.";
    PR=$(echo $0 2&>/dev/null);
case $1 in
.)
    if du -sch $(pwd)/* |egrep "${RE}"; then echo ${PR}; else echo ${NM}; du -sch $(pwd)/*; fi
    ;;
*/)
    if du -sch $1* |egrep "${RE}"; then echo ${PR}; else echo ${NM}; du -sch $1*; fi
    ;;
/*)
    if du -sch $1/* |egrep "${RE}"; then echo ${PR}; else echo ${NM}; du -sch $1/*; fi
    ;;
*)
    if du -sch $1 |egrep "${RE}"; then echo ${PR}; else echo ${NM}; du -sch $1; fi
    ;;
esac
else
    echo -e "No path specified!\r\n1:\t$1\r\n@:\t$@"
fi
}

输出($1中没有空格):

# dubig /var/root/
    - - No matches, printing normal output.
6.4M    /var/root/Library
0   /var/root/bla blea
4.0K    /var/root/test
4.0K    /var/root/test~
6.4M    total

输出(空格在$1中转义):

# dubig /var/root/bla\ blea/
bash: [: /var/root/bla: binary operator expected
No path specified!
1:  /var/root/bla blea/
@:  /var/root/bla blea/

输出(空格,$1中的非转义):

# dubig /var/root/bla blea/
du: cannot access '/var/root/bla/*': No such file or directory
    - - No matches, printing normal output.
du: cannot access '/var/root/bla/*': No such file or directory
0   total

我做错了什么?正如你所看到的,只要$1中没有空格,它就能正常工作。

然而,当输入时转义空间时,似乎认为$1未通过,当输入$1上的 NOT 空间自然地在空格处中断时。

由于缺少声誉,无法添加bash-profile等相关标签。

1 个答案:

答案 0 :(得分:1)

您需要在函数的任何位置使用$1左右的双引号,而不仅仅是du命令。 Bash将对任何未加引号的字符串执行参数扩展和空格分割。

单引号甚至更强,因此'$1'只是由美元符号和第一号组成的文字字符串。

顺便提一下,你的功能基本上只有两个不同的情况,所以它可以简化很多:

dubig() {
    if [ ! -z "$1" ] ; then
        case $1 in
            . | /* | */ ) set -- "$1"/* ;;
            *)  ;;
        esac 
        if du -sch "$@"| 
        egrep "(^[0-9]{2,}(M|\..*M$)|^[0-9]{1,}(G|\..*G$))" then 
            echo $0 2>/dev/null
        else
            echo -e \t- - No matches, printing normal output."
            du -sch "$@"
        fi
    else
        echo -e "No path specified!\r\n1:\t$1\r\n@:\t$@"
    fi
}