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

我很熟悉在批处理中做这种事情,但是无法想出如何在ash中完成(编辑:ash而不是bash)。我正在搜索openwrt配置文件/etc/config/wireless以获得wifi-iface设置。
到目前为止,我可以获得所需的输出:
root@OpenWrt:~# awk '/wifi-iface/ {print $3}' /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:我猜我需要将输出从行更改为string:
root@OpenWrt:~# awk '/wifi-iface/ {print $3}' /etc/config/wireless | sed s/\'//g
| xargs
default_radio0 default_radio1 wifinet1越来越近了,但是for循环是如何工作的呢?
发布于 2020-09-12 10:00:46
将此输出转换为变量,如使用for f循环?
那么,另一个答案的第一个片段就足够了。
如何将多行输出设置为变量
通常,将整个输出保存在某个地方。从那里提取一行,每次一行,如果愿意的话,将其赋值给变量。一种更倾向于shell的方法是在管道中解析数据,而不是将数据存储在任何地方。
我正在尝试设置三个变量$a $b $c
使用临时文件和read的良好POSIX方法
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"但是,如果没有临时文件,您可以调用三个进程来提取行:
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')或者用选项卡分隔的内容来看得更清楚一些:
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行的方法吗?
只是不要移除特定范围内的线条。
x=50;
... | sed "1,$x!d"发布于 2020-09-12 06:17:21
可以使用$(command)构造将命令的输出捕获到变量中:
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替代方法,使用数组(这将更安全地进行评估):
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发布于 2020-09-13 15:21:06
谢谢你的帮助@dash-o和@KamilCuk我终于想出了该做什么:
#!/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
}在以下方面的成果:
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
wifinet1https://stackoverflow.com/questions/63857312
复制相似问题