如何判断变量是否是 bash 中的文件

How do I tell if a variable is a file in bash

我不是一个出色的 bash 脚本编写者,因此有几个问题。其中之一是 bash 如何(甚至是否)理解变量是 "file" 或仅仅是局部变量。

file=/usr/share/lib

显然这是一个要保存的文件等,可以这样使用:

echo "$output" > $file

$output的输出保存到$file

但是它在 bash 的什么地方计算它是否是一个文件,它是否只是一个文件,一旦它被传递给 'writing method'?

如果您将该变量视为文件名,bash 将简单地按照它的指示进行操作,例如

echo "Test output" > $file

无论文件设置为 /tmp/myfile.txt 还是 abcd 都将起作用。在上面,您使用 bash 的 file redirection 将标准写出到您命名的文件中。

因此,如果您在上述模式中使用了错误的变量,或者值设置不正确,bash 将简单地按照您的说明操作,您最终可能会得到错误的 named/located 个文件。

这个你自己去查,bash只知道变量的内容。如果要检查文件位置是否保存在变量中,可以使用 -f test operator

对其进行测试
if [ -f "$file" ]
then
  echo "$file is a file"
  echo "$output" > "$file"
else
  echo "$file is not a file"
fi

变量是字符串 - 仅此而已。 (我在这里忽略了数组变量,WLOG)。

Bash(或任何shell)盲目地扩展变量,而不考虑你打算用它们做什么。只有在命令处理的下一阶段,字符串的内容才重要。

要使用您的示例:

output="foo bar"
file=/usr/share/lib
echo "$output" >"$file"

(我已经引用了$file,虽然这里没有必要,只是因为我被咬了太多次改变价值和打破一切)。

echo "$output" >"$file"

变成了

echo "foo bar" >"/usr/share/lib"

然后 bash 才会考虑 > 并尝试打开 /usr/share/lib 进行写入。