将变量从文本文件加载到bash脚本中

时间:2010-04-16 12:08:35

标签: bash

是否可以将新行从文本文件加载到bash中的变量?

文本文件看起来像?

EXAMPLEfoo 
EXAMPLEbar
EXAMPLE1
EXAMPLE2
EXAMPLE3
EXAMPLE4

变量变为

$1 = EXAMPLEfoo 
$2 = EXAMPLEbar 

ans等等?

5 个答案:

答案 0 :(得分:26)

$ s=$(<file)
$ set -- $s
$ echo $1
EXAMPLEfoo
$ echo $2
EXAMPLEbar
$ echo $@
EXAMPLEfoo EXAMPLEbar EXAMPLE1 EXAMPLE2 EXAMPLE3 EXAMPLE4

我会通过删除临时变量s来改进上述内容:

$ set -- $(<file)

如果您输入了像这样的文件

variable1 = value
variable2 = value

您可以使用以下构造来获取命名变量。

input=`cat filename|grep -v "^#"|grep "\c"`
set -- $input

while [ $1 ]
 do
  eval $1=$3
  shift 3
 done

答案 1 :(得分:4)

cat somefile.txt| xargs bash_command.sh

bash_command.sh将接收这些行作为参数

答案 2 :(得分:3)

saveIFS="$IFS"
IFS=$'\n'
array=($(<file))
IFS="$saveIFS"
echo ${array[0]}    # output: EXAMPLEfoo 
echo ${array[1]}    # output: EXAMPLEbar
for i in "${array[@]}"; do echo "$i"; done    # iterate over the array

修改

你的pastebin中的循环有一些问题。就像你发布它一样:

for i in "${array[@]}"; do echo "  "AD"$count = "$i""; $((count=count+1)); done

这是应该的:

for i in "${array[@]}"; do declare AD$count="$i"; ((count=count+1)); done

for i in "${array[@]}"; do declare AD$count="$i"; ((count++)); done

但为什么不直接使用数组呢?您可以将其称为AD而不是数组,而不是访问名为“AD4”的变量,您将访问数组元素“$ {AD [4]}”。

echo "${AD[4]}"
if [[ ${AD[9]} == "EXAMPLE value" ]]; then do_something; fi

答案 3 :(得分:1)

如果您不需要这些变量作为脚本的输入,则可以使用数组来完成。从Advanced Scripting Guide

取消push()功能
push()            # Push item on stack.
{
if [ -z "$1" ]    # Nothing to push?
then
  return
fi

let "SP += 1"     # Bump stack pointer.
stack[$SP]=$1

return
}

/tmp/test

的内容
[root@x~]# cat /tmp/test
EXAMPLEfoo
EXAMPLEbar
EXAMPLE1
EXAMPLE2
EXAMPLE3
EXAMPLE4

SP=0; for  i in `cat /tmp/test`; do push $i ; done

然后

[root@x~]# echo ${stack[3]}
EXAMPLE1

答案 4 :(得分:1)

如果您的值以空格引用,则上述任何一项都不起作用。

然而,不是每一个都丢失了。

试试这个:

eval "$(VBoxManage showvminfo "$VMname" --details --machinereadable | egrep "^(name|UUID|CfgFile|VMState)")"
echo "$name {$UUID} $VMState ($VMStateChangeTime) CfgFile=$CfgFile"

P.S。 如果您的名字被引用或包含破折号,那么什么都不会有效。 如果您有类似的东西,就像VBoxManage输出的情况一样(&#34; IDE-1-0&#34; =&#34; emptydrive&#34;依此类推),egrep只有特定值,如我的例子所示,或者使错误沉默。

但是,沉默错误总是很危险的。你永远不会知道,当下一个值没有引用时,&#34; *&#34;因此,你必须非常小心地处理以这种方式加载的值,并采取所有适当的预防措施。