巴什尔克ARGV逃生空间



我正在研究一个小的bashrc函数,它将通过du处理grep>= 10MB大小的文件/目录。

但是,我对它如何逃脱空间有一些问题。似乎$1即使在试图用逃离空间时也会在空间中破裂。

我也试图在 bashrc 文件中说:

du -sch "$1"

du -sch $1

du -sch '$1'

du -sch $@

  • 然而,即使在输入时逃逸,它仍然在空间中破裂。

巴什尔克条目:

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!rn1:t$1rn@: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自然地在空间中断。

由于缺少信誉,无法添加相关标签,例如bash-profile

您需要在

函数中任何地方使用双引号$1,而不仅仅是在 du 命令中。Bash 将对任何不带引号的字符串执行参数扩展和空格拆分。

单引号甚至更强,因此'$1'只是由美元符号和数字 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!rn1:t$1rn@:t$@"
    fi
}

相关内容

  • 没有找到相关文章

最新更新