首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将多行输出设置为变量

问如何将多行输出设置为变量
EN

Stack Overflow用户
提问于 2020-09-12 05:57:12
回答 3查看 785关注 0票数 0

编辑3:我的问题已经关闭,并被标记为duplicate,我无法理解。我在这里发帖是因为我在寻求帮助:

​

​

我很熟悉在批处理中做这种事情,但是无法想出如何在ash中完成(编辑:ash而不是bash)。我正在搜索openwrt配置文件/etc/config/wireless以获得wifi-iface设置。

到目前为止,我可以获得所需的输出:

代码语言:javascript
复制
root@OpenWrt:~# awk '/wifi-iface/ {print $3}' /etc/config/wireless | sed s/\'//g
default_radio0
default_radio1
wifinet1

我的问题是如何将输出转换为变量,比如使用for f循环?

编辑#1:类似于:

代码语言:javascript
复制
root@OpenWrt:~# echo $a
default_radio0

root@OpenWrt:~# echo $b
default_radio1

root@OpenWrt:~# echo $c
wifinet1

编辑2:我猜我需要将输出从行更改为string:

代码语言:javascript
复制
root@OpenWrt:~# awk '/wifi-iface/ {print $3}' /etc/config/wireless | sed s/\'//g
 | xargs
default_radio0 default_radio1 wifinet1

越来越近了,但是for循环是如何工作的呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-09-12 10:00:46

将此输出转换为变量,如使用for f循环?

那么,另一个答案的第一个片段就足够了。

如何将多行输出设置为变量

通常,将整个输出保存在某个地方。从那里提取一行,每次一行,如果愿意的话,将其赋值给变量。一种更倾向于shell的方法是在管道中解析数据,而不是将数据存储在任何地方。

我正在尝试设置三个变量$a $b $c

使用临时文件和read的良好POSIX方法

代码语言:javascript
复制
tmpf=$(mktemp)
awk '/wifi-iface/ {print $3}' /etc/config/wireless | sed s/\'//g > "$tmpf"
{
   # read three lines of input
    IFS= read -r a
    IFS= read -r b
    IFS= read -r c
} < "$tmpf"
rm "$tmpf"

但是,如果没有临时文件,您可以调用三个进程来提取行:

代码语言:javascript
复制
tmp=$(awk '/wifi-iface/ {print $3}' /etc/config/wireless | sed s/\'//g)
a=$(printf "%s\n" "$tmp" | sed '1!d')
b=$(printf "%s\n" "$tmp" | sed '2!d')
c=$(printf "%s\n" "$tmp" | sed '3!d')

或者用选项卡分隔的内容来看得更清楚一些:

代码语言:javascript
复制
tmp=$(awk '/wifi-iface/ {print $3}' /etc/config/wireless | sed s/\'//g | paste -s)
a=$(printf "%s\n" "$tmp" | cut -f1)
b=$(printf "%s\n" "$tmp" | cut -f2)
c=$(printf "%s\n" "$tmp" | cut -f3)

--我猜我需要将输出从行改为字符串:

线条是字符串。

有读取所有第1行到x行的方法吗?

只是不要移除特定范围内的线条。

代码语言:javascript
复制
x=50; 
... | sed "1,$x!d"
票数 1
EN

Stack Overflow用户

发布于 2020-09-12 06:17:21

可以使用$(command)构造将命令的输出捕获到变量中:

代码语言:javascript
复制
wireless_list=$(awk '/wifi-iface/ {print $3}' /etc/config/wireless | sed s/\'//g)
for w in ${wireless_list} ; do
    # Do something with $w
    echo "$w"
done

替代方法,使用数组(这将更安全地进行评估):

代码语言:javascript
复制
readarray -t wireless_list <<< "$(awk '/wifi-iface/ {print $3}' /etc/config/wireless | sed s/\'//g)"
for w in "${wireless_list[@]}" ; do
    # Do something with $w
    echo "$w"
done
票数 1
EN

Stack Overflow用户

发布于 2020-09-13 15:21:06

谢谢你的帮助@dash-o和@KamilCuk我终于想出了该做什么:

代码语言:javascript
复制
#!/bin/sh

function list_wifi {
wifi=$(awk '/wifi-iface/ {print $3}' /etc/config/wireless | sed s/\'//g)

count=0 && for string in $wifi
  do
    eval ap$((++count))=$string
  done

ap=$(echo "$wifi" | wc -l)
  if [[ $ap -eq 1 ]];
    then
      echo next_function
    else
      echo "--Multiple APs detected"
  fi

count=0 && for string in $wifi
  do
    echo $((++count))-$string
  done

x=0 && while [[ $x -lt 1 || $x -gt $ap ]]
  do
    printf "--Select AP to clone (1-$ap): "
    read x
  done
}

在以下方面的成果:

代码语言:javascript
复制
root@OpenWrt:~# sh test
--Multiple APs detected
1-default_radio0
2-default_radio1
3-wifinet1
--Select AP to clone (1-3):

与变量:

代码语言:javascript
复制
echo $ap1
default_radio0
echo $ap2
default_radio1
echo $ap3
wifinet1
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63857312

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档