是否可以将新行从文本文件加载到bash中的变量?
文本文件看起来像?
EXAMPLEfoo
EXAMPLEbar
EXAMPLE1
EXAMPLE2
EXAMPLE3
EXAMPLE4
变量变为
$1 = EXAMPLEfoo
$2 = EXAMPLEbar
ans等等?
答案 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;因此,你必须非常小心地处理以这种方式加载的值,并采取所有适当的预防措施。