我不是一个伟大的bash
脚本编写者,因此有一些问题。其中之一是bash
如何(甚至是否)理解变量是"文件"或者只是一个局部变量。
file=/usr/share/lib
显然这是一个要保存的文件等,可以这样使用:
echo "$output" > $file
将$output
的输出保存到$file
。
但bash
在哪里计算它是否是一个文件,它是否只是一个文件,一旦它被传递给一个&#39;写入方法&#39; < / p>
答案 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
进行撰写。