为什么“$i | sed”不起作用?

为什么“$i | sed”不起作用?

我有这个代码:

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 的参数。

相关内容