【发布时间】:2017-11-22 06:18:18
【问题描述】:
是否可以将文本文件中的新行加载到 bash 中的变量中?
文本文件长什么样?
EXAMPLEfoo
EXAMPLEbar
EXAMPLE1
EXAMPLE2
EXAMPLE3
EXAMPLE4
变量变成
$1 = EXAMPLEfoo
$2 = EXAMPLEbar
还有吗?
【问题讨论】:
标签: bash
是否可以将文本文件中的新行加载到 bash 中的变量中?
文本文件长什么样?
EXAMPLEfoo
EXAMPLEbar
EXAMPLE1
EXAMPLE2
EXAMPLE3
EXAMPLE4
变量变成
$1 = EXAMPLEfoo
$2 = EXAMPLEbar
还有吗?
【问题讨论】:
标签: bash
$ 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
【讨论】:
cat somefile.txt| xargs bash_command.sh
bash_command.sh 将接收这些行作为参数
【讨论】:
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
【讨论】:
如果您不需要这些变量作为脚本的输入,这可以通过数组来完成。 push() 函数从 Advanced Scripting Guide 提升
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
【讨论】:
如果您的值用空格引用,上述方法均无效。
然而,并不是所有的一切都会丢失。
试试这个:
eval "$(VBoxManage showvminfo "$VMname" --details --machinereadable | egrep "^(name|UUID|CfgFile|VMState)")"
echo "$name {$UUID} $VMState ($VMStateChangeTime) CfgFile=$CfgFile"
附:
如果您的名字被引用或包含破折号,任何事情都不会奏效。
如果您有类似的情况,例如 VBoxManage 输出(“IDE-1-0”=“emptydrive”等),egrep 仅特定值,如我的示例所示,或者使错误静音。
但是,消除错误总是很危险的。您永远不知道,下一个值何时会在其中包含不带引号的“*”,因此您必须非常小心地处理以这种方式加载的值,并采取一切应有的预防措施。
【讨论】: