我正在开发一个小的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
等相关标签。
答案 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
}