1,好的习惯:给变量名和命令替换加双引号。
cd $dir_name
rm *
改进:
cd "$dir_name" && rm *
如果dir_name空,仍有隐患,继续改进:
[[ -d "$dir_name" ]] && cd "$dir_name" && rm *
还可以加上交互提示:
# Delete files in directory $dir_name
if [[ ! -d "$dir_name" ]]; then
echo "No such directory: '$dir_name'" >&2
exit 1
fi
if ! cd "$dir_name"; then
echo "Cannot cd to '$dir_name'" >&2
exit 1
fi
if ! rm *; then
echo "File deletion failed. Check results" >&2
exit 1
fi
2,文件名
unix系统,只有两个字符是不能用于文件名,/和null(a zero byte),/用于分隔路径,null字符串结尾标志,其他的任何都是合法的。
例如一个文件名:"-rf ~"。所以 rm * 就要改成 rm ./*,这样就可以阻止“-”开头的文件名被当做选项符。最好在通配符(例如?*)前面都加上“./”,就可以阻止命令行的误解析。
兼容的文件名,最好是由字母、数字、下划线、-(减)、.(点)组成,并且不能以减开头。
3,调试
bash -x 可以用来跟踪。输出结果中,用+来标志代码。例如:
#!/bin/bash -x
# trouble: script to demonstrate common errors
number=1
if [ $number = 1 ]; then
echo "Number is equal to 1."
else
echo "Number is not equal to 1."
fi
[me@linuxbox ~]$ trouble
+ number=1
+ '[' 1 = 1 ']'
+ echo 'Number is equal to 1.'
Number is equal to 1.
目的是跟正常输出区别开来。可以用PS4来改变代码提示,
[me@linuxbox ~]$ export PS4='$LINENO + '
[me@linuxbox ~]$ trouble
5 + number=1
7 + '[' 1 = 1 ']'
8 + echo 'Number is equal to 1.'
Number is equal to 1.
还可以值跟踪一部分代码,
set -x 开启跟踪
set +x 关闭跟踪
例如:
#!/bin/bash
# trouble: script to demonstrate common errors
number=1
set -x # Turn on tracing
if [ $number = 1 ]; then
echo "Number is equal to 1."
else
echo "Number is not equal to 1."
fi
set +x # Turn off tracing
使用echo 语句打印变量的值。