Linux的shell编程易错点解析(cp复制带空格和短横线的文件)


在我的上一篇文章
Linux的shell编程易错点解析(for循环和ls命令)
提到了如果文件名含有空格,则会在对文件的操作中可能出错。
同理,除了循环遍历文件名,在复制文件时,如果带有空格和短横线,也可能出错。

1. 系统环境

[root@db01 scripts]# cat /etc/redhat-release 
CentOS Linux release 7.5.1804 (Core) 
[root@db01 scripts]# uname -r
3.10.0-862.el7.x86_64

2. 文件名带空格

首先创建一个符合要求的文件

touch "01 - Don't Eat the Yellow Snow.mp3"

然后利用脚本复制文件
错误案例如下:

#!/bin/bash
file="01 - Don't Eat the Yellow Snow.mp3"
target="/tmp"
cp $file $target

这样复制的file实际上是空格拆分的单词,复制实际不存在的文件,所以报错。
正确的做法是,加上双引号,将字符串括起来的变量当作一个整体。
正确案例如下:

[root@db01 scripts]# cat test.sh 
#!/bin/bash
file="01 - Don't Eat the Yellow Snow.mp3"
target="/tmp"
cp "$file" "$target"

3. 文件名带短横线

同样是上面的案例,我们可以重复使用。
错误已经清楚,直接说解决方法。
方法一:在命令和参数之间加上--

cp -- "$file" "$target"

这个符号的作用是,告诉不要对符号后面内容进行命令行参数解析
缺点在于,如果命令不是以上述方式呈现,方法无效。

方法二:让文件名以相对路径或绝对路径表示

#!/bin/bash
for i in ./*.mp3;
do
    cp "$i" /target
    ...
done

个人推荐尽可能使用绝对路径表示文件名。
因为Linux的定时任务crontab -e中的命令都必须用绝对路径表示,为方便记忆,所有涉及参数的表示都使用绝对路径,出错的概率更低。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值