mkdir 在 shell 脚本里如何识别~目录?

2016-07-16 15:21:31 +08:00
 patrickstar
#!/bin/sh

# ~扩展在变量扩展前面进行
export TMP_DIR=~/.tangolog

if [ ! -d $TMP_DIR ]
then
mkdir $TMP_DIR
# mkdir "$TMP_DIR" 也不对
fi


把 export TMP_DIR=~/.tangolog 改为 export TMP_DIR=/home/xxx/.tangolog 即可,否则就无法创建目录(~没有解析对)

请问如何才能在 shell 脚本里正确解析 ~ 目录,记得以前看过,今天要用的时候死活想不起来啦
4688 次点击
所在节点    Linux
9 条回复
tracyone
2016-07-16 15:37:16 +08:00
$HOME
notgod
2016-07-16 15:45:19 +08:00
export TMP_DIR=$(~/.tangolog)

没转义
lxf1992521
2016-07-16 19:16:04 +08:00
估计是你的用户名中包含各种特殊字符,如空格、 TAB 、&、| 等,不然的话,不会出现这种情况的。
所以,以防万一,对变量要加上引号:

if [ ! -d "$TMP_DIR" ]
then
mkdir "$TMP_DIR "
greenskinmonster
2016-07-16 19:31:33 +08:00
先用 realpath 处理下
EchoWhale
2016-07-16 20:27:48 +08:00
$HOME
patrickstar
2016-07-16 21:30:36 +08:00
@lxf1992521 用户名没有特殊字符,就 4 个英文字母
@tracyone OK
@notgod 好像不行
lcj2class
2016-07-16 23:30:09 +08:00
不知道 lz 遇到什么问题,我在 Mac 、 centos 上测试了下面的代码可以在家目录创建目录的:

```

export ff=~/.haha


if [ ! -d $ff ];then
mkdir $ff
fi
```
raysonx
2016-07-17 01:49:05 +08:00
我在我自己的机器上拿楼主的脚本跑了一下,是正常工作的。
从这句来看`mkdir $TMP_DIR`,$TMP_DIR 是会 Bash 被展开的,所以最好加上双引号,防止特殊符号注入。
另外, if 是不需要的,`mkdir -p "$TMP_DIR"`可以代替。
skydiver
2016-07-17 02:09:34 +08:00
https://www.gnu.org/software/bash/manual/html_node/Tilde-Expansion.html

~ 展开是 bash 的功能,你用的 /bin/sh 当然不行了……
要么改成 /bin/bash 要么用$HOME

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/292877

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX