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

时间:2015-08-06 14:53:50

标签: bash terminal

我不是一个伟大的bash脚本编写者,因此有一些问题。其中之一是bash如何(甚至是否)理解变量是"文件"或者只是一个局部变量。

file=/usr/share/lib

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

echo "$output" > $file

$output的输出保存到$file

bash在哪里计算它是否是一个文件,它是否只是一个文件,一旦它被传递给一个&#39;写入方法&#39; < / p>

3 个答案:

答案 0 :(得分:2)

如果您将该变量视为文件名,bash只会执行它所说的内容。

#!/bin/python3
import sys, subprocess
text = sys.argv[1]
target = sys.argv[2]
if len(text)>16:
    print("Text too long!")
    exit()
enctext = r''.join( hex(ord(c)).split("x")[1] for c in text )
subprocess.check_output(["ping", "-p", enctext, "-c", "1", target])
无论将文件设置为echo "Test output" > $file 还是/tmp/myfile.txt

都能正常工作。在上文中,您使用bash的file redirection将标准写出到您已命名的文件中。

因此,如果您在上述模式中使用了错误的变量,或者设置的值不正确,则bash只会按照您的说明进行操作,最终您可能会错误地命名/找到文件。

答案 1 :(得分:2)

你需要自己检查一下,bash只知道变量的内容。如果要检查变量中是否包含文件位置,可以使用-f test operator

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

答案 2 :(得分:0)

变量是字符串 - 仅此而已。 (我在这里忽略了数组变量,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进行撰写。