如何同时迭代两个字符串ksh

时间:2017-08-04 16:36:35

标签: ksh

我正在使用另一个人的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

这显然不是正确的语法,但我一直无法找到使其工作的方法。有没有办法同时迭代这两个?

我知道我可以先将它们转换为数组,然后按数字元素进行迭代,但如果有办法同时迭代它们,我想节省转换它们的时间。

2 个答案:

答案 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
++++++++++