BASH将文本文件逐行转换为variables

我想为多分区系统自动设置一个脚本。 第一个行动是

lspci | grep -i 'vga\|graphic' | cut -b 1-7 > text.txt

现在我想把文件的两行变成variables。 我的低调解决scheme是这样的:

 VAR1=$(head -n 1 text.txt) VAR2=$(tail -n 1 text.txt) 

它也可以,但是,可能有更好的解决scheme,将文本文件逐行转换为variables。

下面应该实现你正在做什么,而不使用临时文件

 #!/bin/bash { read -r var1 _ && read -r var2 _; } < <(lspci | grep -i 'vga\|graphics') 

现在,如果你有几行来自lspci | grep -i 'vga\|graphics' lspci | grep -i 'vga\|graphics' (或者只是一个,或者没有),你可能需要一些更一般的东西,也就是把结果放到一个数组中:

 #!/bin/bash var=() while read -rf _; do var+=( "$f" ); done < <(lspci | grep -i 'vga\|graphics') # display the content of var declare -p var 

如果你有最新版本的Bash,并且你喜欢mapfileawk (但是谁不?),你也可以这样做:

 #!/bin/bash mapfile -t var < <(lspci | awk 'tolower($0) ~ /var|graphics/ { print $1 }') # display the content of var declare -p var 

纯粹的Bash可能性(当然除了lspci ):

 #!/bin/bash shopt -s extglob var=() while read -rv rest; do [[ ${rest,,} = *@(vga|graphics)* ]] && var+=( "$v" ) done < <(lspci) # display var declare -p var 

这使用:

  • 使用${rest,,} rest小写转换
  • 使用*@(vga|graphics)*进行模式匹配和扩展 *@(vga|graphics)* (避免使用正则表达式)。

如果可以将文本文件格式化为名称值对,则可以使用bash 关联数组来存储和引用每个项目。 在这个代码中注意=用作分隔符以分隔名称值对。

 #read in fast config (name value pair file) declare -A MYMAP while read item; do NAME=$(cut -d "=" -f1 <<<"$item") VALUE=$(cut -d "=" -f2 <<<"$item") MYMAP["$NAME"]="$VALUE" done <./config_file.txt #size of map MYMAP_N=${#MYMAP[@]} #make a list of keys KEYS=("${!MYMAP[@]}") #dereference map SELECTION="${MYMAP["my_first_key"]}" 

如果值不包含空格,则在bash使用数组变量:

 declare -a vars eval "vars=(`echo line1; echo line2`)" # the `echo ...` simulates your command echo number of values: ${#vars[@]} for ((I = 0; I < ${#vars[@]}; ++I )); do echo value \#$I is ${vars[$I]} done echo all values : ${vars[*]} 

诀窍是生成用值初始化数组的语句,然后eval它。

如果值有空格/特殊字符,则可能需要转义/引用。

read VAR1 VAR2 < <(sed -n '1p;$p' myfile | tr '\n' ' ')

这应该做你所需要的,它使用过程替换来打印你想要的行,然后将它们重定向到变量,如果你想要不同的行只是建立这个语句,你需要一个for循环放任何你想要的行都使用wc来计算行数,然后构建VAR1 .. VAR [n]和sed -n'1p; 2p; 3p .. [n] p'然后您就可以评估内置语句。