我有这个代码:
if [ $i | sed -e "s/^.*\(.\)$/\1/" = "/" ]
then
echo "folder"
else
echo "file"
fi
哪里$i
有这样的东西
app4/
上面的代码应该获取字符串的最后一个字符并检查它是否是斜杠(/
),但它告诉我:
./str:第12行:=app4/:文件或目录不存在
我该如何解决这个问题?
答案1
您可以替换 in 的值$i
来查看您尝试运行的确切命令:
app4/ | sed -e "s/^.*\(.\)$/\1/"
这不起作用,因为app4/
不是命令。您正在尝试通过管道输入app4/
,sed
因此您需要使用输出的内容app4/
:
echo app4/ | sed -e "s/^.*\(.\)$/\1/"
这可行,但您实际上并不需要sed
为此使用;bash
有相当多的字符串操作工具。例如,${i#}
将为您提供 的长度$i
,并${i:j}
为您提供从 开始的子字符串j
,因此${i:$((${i#}-1))}
将为您提供最后一个字符。
完成您正在尝试的操作的最简单方法可能是使用${i%/}
.这将返回,但如果有的话,将从末尾$i
删除 a :/
$ i="app4"; echo ${i%/}
app4
$ i="app4/"; echo ${i%/}
app4
因此:
if [ "${i%/}" = "$i" ]
then
echo "file"
else
echo "folder"
fi
然而,如果你都真的想要知道是否$i
是一个有效的目录,你可以使用:
if [ -d "$i" ]
答案2
检查变量是否以 / 结尾的最简单方法是:
[[ $i = */ ]]
..尽管正如 Johan 所说,您可以检查它是否存在,如果不存在则创建它。然而,应该正确引用:
if [[ ! -d $i ]]; then
mkdir -p "$i" || exit 1
fi
我们不需要在 [[ .. ]] 内部引用扩展,这连同其更大的实用性和速度,使得它更好用;我们肯定需要引用 mkdir 的参数。