30,疑难排解

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 语句打印变量的值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值