我想为多分区系统自动设置一个脚本。 第一个行动是
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,并且你喜欢mapfile
和awk
(但是谁不?),你也可以这样做:
#!/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'然后您就可以评估内置语句。