如何从文件中读取变量?

use*_*413 87 bash scripts

我想在我的脚本中插入一个我将从文本文件中读取的值(字符串)。

例如,而不是:

echo "Enter your name"
read name
Run Code Online (Sandbox Code Playgroud)

我想从另一个文本文件中读取一个字符串,因此解释器应该从文件而不是用户输入中读取字符串。

Tak*_*kat 126

要从文件中读取变量,我们可以使用sourceor.命令。

让我们假设文件包含以下行

MYVARIABLE="Any string"
Run Code Online (Sandbox Code Playgroud)

然后我们可以使用导入这个变量

#!/bin/bash

source <filename>
echo $MYVARIABLE
Run Code Online (Sandbox Code Playgroud)

  • 您可能不想这样做的原因之一是因为 `&lt;filename&gt;` 中的任何内容都将在您的 shell 中运行,例如 `rm -rf /`,这可能非常危险。 (26认同)
  • 聚会迟到了,但是,不,它不应该被标记或作为答案。这提供了另一个 bash 源文件,这不是 OP 要求的。他问如何将 FILE 的内容读入变量。不是如何执行另一个*设置变量*的脚本。正确答案如下。name=$(cat "$file") 。 (7认同)
  • OTOH,这是我问谷歌和谷歌把我带到这里的问题的答案。奇怪的时代,嗯? (3认同)
  • 您可以使用“sed”添加“local”关键字,使脚本更安全,不会污染您的全局范围。所以在函数内部执行`cat global_variables.sh | sed -e 's/^/local /' &gt; local_variables.sh` 然后使用 `. ./local_variables.sh`。您在该函数中导入的任何内容都仅在该函数中可用。请注意,它假设“global_variables.sh”每行仅包含一个变量。 (2认同)

Rad*_*anu 78

考虑到您希望将文本文件的所有内容保存在变量中,您可以使用:

#!/bin/bash

file="/path/to/filename" #the file where you keep your string name

name=$(cat "$file")        #the output of 'cat $file' is assigned to the $name variable

echo $name               #test
Run Code Online (Sandbox Code Playgroud)

或者,在纯 bash 中:

#!/bin/bash

file="/path/to/filename"     #the file where you keep your string name

read -d $'\x04' name < "$file" #the content of $file is redirected to stdin from where it is read out into the $name variable

echo $name                   #test
Run Code Online (Sandbox Code Playgroud)

  • @user208413 `$name` 变量的值是使用 `cat $file` 命令分配的文件中的字符串。什么是不清楚或如此难以理解? (6认同)
  • 如果你只使用它一次加载 `$name` 变量,那么使用单独的 `$file` 变量是多余的,只需使用 `cat /path/to/file` (2认同)
  • 该解决方案没有任何内容可以回答问题。它忽略了他提到的在不同文件中搜索特定字符串的内容,而是将整个文本文件的内容转换为 shell 变量。令人惊讶的是有多少选民不识字…… (2认同)

tho*_*hom 15

在您的脚本中,您可以执行以下操作:

read name < file_containing _the_answer
Run Code Online (Sandbox Code Playgroud)

您甚至可以多次执行此操作,例如在循环中

while read LINE; do echo "$LINE"; done < file_containing_multiple_lines
Run Code Online (Sandbox Code Playgroud)


小智 10

name=$(<"$file") 
Run Code Online (Sandbox Code Playgroud)

man bash:1785,此命令替换等效name=$(cat "$file")但速度更快。


Tom*_*han 8

执行此操作的另一种方法是将标准输入重定向到您的文件,在该文件中您可以按照程序预期的顺序获得所有用户输入。例如,使用程序(称为script.sh

#!/bin/bash
echo "Enter your name:"
read name
echo "...and now your age:"
read age

# example of how to use the values now stored in variables $name and $age
echo "Hello $name. You're $age years old, right?"
Run Code Online (Sandbox Code Playgroud)

和输入文件(称为input.in

Tomas
26
Run Code Online (Sandbox Code Playgroud)

您可以通过以下两种方式之一从终端运行它:

$ cat input.in | ./script.sh
$ ./script.sh < input.in
Run Code Online (Sandbox Code Playgroud)

这相当于只是运行脚本并手动输入数据 - 它会打印“Hello Tomas。你 26 岁,对吗?”这一行。

作为?拉杜[R deanu已经建议,你可以用cat你的脚本中读取文件的内容到一个avariable -在这种情况下,你需要在每个文件只包含一条线,只有你想为特定变量的值. 在上面的例子中,你输入文件分割成一个名为(比如说name.in)和一个与年龄(比如age.in),并更改read name,并read age线name=$(cat name.in)age=$(cat age.in)分别。