在 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
编辑 #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
:
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