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

In ash how to set multiple line output to variables

编辑 #3:我的问题已关闭并标记为 duplicate,我无法跟进。我在这里发帖是因为我在寻求帮助:(

我熟悉批量执行此类操作,但不知道如何在 ash 中执行此操作(编辑:ash 而不是 bash)。 我在 openwrt 配置文件 /etc/config/wireless 中搜索 wifi-iface 设置。

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

root@OpenWrt:~# awk '/wifi-iface/ {print }' /etc/config/wireless | sed s/\'//g
default_radio0
default_radio1
wifinet1

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

编辑 #1:类似于:

root@OpenWrt:~# echo $a
default_radio0

root@OpenWrt:~# echo $b
default_radio1

root@OpenWrt:~# echo $c
wifinet1

编辑 #2:我猜我需要将输出从行更改为字符串:

root@OpenWrt:~# awk '/wifi-iface/ {print }' /etc/config/wireless | sed s/\'//g
 | xargs
default_radio0 default_radio1 wifinet1

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

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

wireless_list=$(awk '/wifi-iface/ {print }' /etc/config/wireless | sed s/\'//g)
for w in ${wireless_list} ; do
    # Do something with $w
    echo "$w"
done

替代方法,使用数组(评估更安全):

readarray -t wireless_list <<< "$(awk '/wifi-iface/ {print }' /etc/config/wireless | sed s/\'//g)"
for w in "${wireless_list[@]}" ; do
    # Do something with $w
    echo "$w"
done

turn this output into variables like using a for f loop?

那么其他答案的第一个片段就足够了。

how to set multiple line output to variables

一般来说,将整个输出保存在某个地方。从那里,提取行,一次一个,并分配给变量,如果你愿意的话。一种更 shell-ish 的方法是在管道中解析数据而不将其存储在任何地方。

I am trying to set three variables $a $b $c

使用临时文件和 read:

的好方法 POSIX
tmpf=$(mktemp)
awk '/wifi-iface/ {print }' /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"

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

tmp=$(awk '/wifi-iface/ {print }' /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')

或者用制表符分隔的内容可能更清晰一些:

tmp=$(awk '/wifi-iface/ {print }' /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)

I'm guessing i need to change the output from lines to string:

行是字符串。

is there a way to read all lines 1 to x?

只是不要删除特定范围内的行。

x=50; 
... | sed "1,$x!d"

感谢@dash-o 和@KamilCuk 的帮助,我终于想出了办法:

#!/bin/sh

function list_wifi {
wifi=$(awk '/wifi-iface/ {print }' /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
}

结果:

root@OpenWrt:~# sh test
--Multiple APs detected
1-default_radio0
2-default_radio1
3-wifinet1
--Select AP to clone (1-3):

有变量:

echo $ap1
default_radio0
echo $ap2
default_radio1
echo $ap3
wifinet1