我正在使用另一个人的ksh93脚本以打印格式返回到标准输出的数据。根据我给它的标志,他们的脚本为我提供了我的代码所需的信息。它就像一个用空格分隔的列表,这样程序的运行格式为:
"1 3 4 7 8"
"First Third Fourth Seventh Eighth"
对于我正在处理的内容,我需要能够匹配每个输出的条目,以便我可以按以下格式打印信息:
1:First
3:Third
4:Fourth
7:Seventh
8:Eighth
我需要做的不仅仅是打印数据,我只需要能够访问每个字符串中的信息对。即使字符串的实际内容可以是任意数量的值,我从运行另一个脚本获得的两个字符串将始终具有相同的长度。
我想知道是否存在一种同时迭代这两种方式的方法,其中包括:
str_1=$(other_script -f)
str_2=$(other_script -i)
for a,b in ${str_1},${str_2} ; do
print "${a}:${b}"
done
这显然不是正确的语法,但我一直无法找到使其工作的方法。有没有办法同时迭代这两个?
我知道我可以先将它们转换为数组,然后按数字元素进行迭代,但如果有办法同时迭代它们,我想节省转换它们的时间。
答案 0 :(得分:1)
为什么你认为将字符串转换为数组并不快? 例如:
`#!/bin/ksh93
set -u
set -A line1
string1="1 3 4 7 8"
line1+=( ${string1} )
set -A line2
string2="First Third Fourth Seventh Eighth"
line2+=( ${string2})
typeset -i num_elem_line1=${#line1[@]}
typeset -i num_elem_line2=${#line2[@]}
typeset -i loop_counter=0
if (( num_elem_line1 == num_elem_line2 ))
then
while (( loop_counter < num_elem_line1 ))
do
print "${line1[${loop_counter}]}:${line2[${loop_counter}]}"
(( loop_counter += 1 ))
done
fi
`
答案 1 :(得分:0)
与其他评论一样,不确定为什么数组是不可能的,特别是如果您计划在代码中多次引用各个元素。
一个示例脚本,假定您希望将str_1 / str_2变量维护为字符串;我们将加载到数组中以引用各个元素:
$ cat testme
#!/bin/ksh
str_1="1 3 4 7 8"
str_2="First Third Fourth Seventh Eighth"
str1=( ${str_1} )
str2=( ${str_2} )
# at this point matching array elements have the same index (0..4) ...
echo "++++++++++ str1[index]=element"
for i in "${!str1[@]}"
do
echo "str1[${i}]=${str1[${i}]}"
done
echo "++++++++++ str2[index]=element"
for i in "${!str1[@]}"
do
echo "str2[${i}]=${str2[${i}]}"
done
# since matching array elements have the same index, we just need
# to loop through one set of indexes to allow us to access matching
# array elements at the same time ...
echo "++++++++++ str1:str2"
for i in "${!str1[@]}"
do
echo ${str1[${i}]}:${str2[${i}]}
done
echo "++++++++++"
并运行一下脚本:
$ testme
++++++++++ str1[index]=element
str1[0]=1
str1[1]=3
str1[2]=4
str1[3]=7
str1[4]=8
++++++++++ str2[index]=element
str2[0]=First
str2[1]=Third
str2[2]=Fourth
str2[3]=Seventh
str2[4]=Eighth
++++++++++ str1:str2
1:First
3:Third
4:Fourth
7:Seventh
8:Eighth
++++++++++