我正在研究一个小的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
}