初接触unix,开始写shell,遇到一个很恼人的问题。
先看看需求:
创建一个文件夹,在里面新建一个文件
多简单是吧
再看看格式
/root/my dir/sub dir/test file.txt
(当然,这里只是模仿的,重点是无论文件夹名称、文件名称都是有空格的)
dir=/root/my dir/sub dir
file=${dir}/test file.txt
其实这里第一个就执行不了:-bash: dir/sub: No such file or directory,shell不认空格的。
dir="/root/my dir/sub dir"
file="${dir}/test file.txt"
echo $dir
# /root/my dir/sub dir
echo $file
# /root/my dir/sub dir/test file.txt
看起来很正常了,来创建看看
mkdir -p $dir
可以发现,并没有创建my dir和sub dir文件夹,反而多了my、dir这样的几个文件夹。可以发现,其实它相当于执行了
mkdir -p /root/my dir/sub dir
竟然双引号可以让空格失效,那我们来加上双引号
mkdir -p "$dir"
创建成功!
用同样的方法创建test file.txt
touch "${file}"
其实在使用上面的方法前,我已经尝试过各种语法,包括括号、单引号、双引号、反斜线,甚至交替使用(因为我之前没接触过shell语法,完全是用java语法来套的),碰壁碰出来的。
dir="/root/my dir/sub dir"
dir=/root/my\ dir/sub\ dir
dir='/root/my dir/sub dir'
以上三个是一样的,输入都是:/root/my dir/sub dir。
但是如果改一下格式,后面要根据时间创建一个文件夹,很显示要使用函数了。来看看
dir="/root/my dir/sub dir/`date +%Y%m%d`"
dir=/root/my\ dir/sub\ dir/`date +%Y%m%d`
dir='/root/my dir/sub dir/`date +%Y%m%d`'
最后一行输出的是:/root/my dir/sub dir/date +%Y%m%d
。
可以得出结论:
- 单引号的作用就是把它里面的东西,完完整整地输出来
- 双引号可以使部分符号、变量失效,可是某些特殊符号、变量依然生效
另外,
touch $dir/'test file.txt'
touch $dir/"test file.txt"
touch $dir/test\ file.txt
以上三个都是不成功的,需要全部包起来!
touch “$dir/test file.txt”