我想~/tost1
使用变量 $i 检查文件是否存在,该变量等于~/tost1
。 If 语句不适用于该变量。 有什么办法可以修复它吗?
i=~/tost1
$ echo $i
~/tost1
$ if [ -e ${i} ]; then echo "file exists"; fi
$ if [ -e ~/tost1 ]; then echo "file exists"; fi
file exists
答案1
笔记:OP 在评论“我在 termux 应用程序中临时使用 bash。它的行为似乎与‘常规’ bash 不同。” 这解释了这种不寻常的行为。
根据bash 4.3
Ubuntu 16.04使用的手册:
每次变量赋值时,都会检查紧跟在 : 或第一个 = 后面的未加引号的波浪号前缀。在这些情况下,还会执行波浪号扩展。
在您的特定情况下,波浪号被视为文字字符,并且您[
正在目录中寻找应该称为的文件~
。 这就是它失败的原因。
请使用环境变量$HOME
,例如$HOME/tost1
。
答案2
这在 16.04 LTS 中对我有用,当从终端窗口的命令行运行时,
$ i=~/tost1
$ echo "$i"
/home/sudodus/tost1
$ touch ~/tost1
$ if [ -e ${i} ]; then echo "file exists";else echo "file does not exist";fi
file exists
但是使用$HOME
而不是波浪号是一个好主意,特别是如果你打算用你交互测试的命令制作一个 shellscript 时,所以从
$ i="$HOME"/tost1
$ touch ~/tost1
$ if [ -e "${i}" ]; then echo "file exists";else echo "file does not exist";fi
file exists
如果想避免不愉快的意外,使用双引号括住变量是一个好习惯。(有少数例外。)