Shell sh和ksh外壳中带分隔符的参数扩展

Shell sh和ksh外壳中带分隔符的参数扩展,shell,sh,ksh,Shell,Sh,Ksh,我有一个类似于这个问题中解决的问题: 真正的区别在于,我的目标是sh和kshshell,因此,例如,我不能使用您可以使用awk并降低所有复杂性: echo "$VALUES"|awk -F' *; *' 'NF>1{print $1, $2, $3}' val1 val2 val3 another1 another2 another3 您可以使用awk并降低所有复杂性: echo "$VALUES"|awk -F' *; *' 'NF>1{print $1, $2, $3}' va

我有一个类似于这个问题中解决的问题:


真正的区别在于,我的目标是
sh
ksh
shell,因此,例如,我不能使用
您可以使用awk并降低所有复杂性:

echo "$VALUES"|awk -F' *; *' 'NF>1{print $1, $2, $3}'
val1 val2 val3
another1 another2 another3

您可以使用awk并降低所有复杂性:

echo "$VALUES"|awk -F' *; *' 'NF>1{print $1, $2, $3}'
val1 val2 val3
another1 another2 another3

在阅读你的问题时,你谈论的是数组。给你:

typeset -a values
typeset -i i=0
echo "$VALUES" | while IFS=' ;' read v1 v2 v3; do
    [[ -z $v1 && -z $v2 && -z $v3 ]] && continue
    values[i]=$v1
    values[i+1]=$v2
    values[i+2]=$v3
    ((i+=3))
done

for i in "${!values[@]}"; do printf "%d\t%s\n" $i "${values[i]}"; done

在阅读你的问题时,你谈论的是数组。给你:

typeset -a values
typeset -i i=0
echo "$VALUES" | while IFS=' ;' read v1 v2 v3; do
    [[ -z $v1 && -z $v2 && -z $v3 ]] && continue
    values[i]=$v1
    values[i+1]=$v2
    values[i+2]=$v3
    ((i+=3))
done

for i in "${!values[@]}"; do printf "%d\t%s\n" $i "${values[i]}"; done


@blueberryfields我想这会管用的,但讨论一些不需要任何外部工具的东西会很好,只是想看看这是否可以通过
sh
ksh
,使用外部工具,它并不真的像是针对特定的外壳,它只是。。。使用外部工具,嗯?另一个问题的公认答案是使用纯shell,没有外部工具(尽管Awk通常以某种形式提供),也没有Bash。@tripleee我想我读过
@tripleee,但该解决方案并不能很好地处理循环和迭代,这里给出的解决方案确实如此。@blueberryfields我想这会起作用,但讨论一些不需要任何外部工具的东西会很好,只是想看看这是否可以通过
sh
ksh
实现,使用外部工具并不是真的像针对特定的外壳,只是。。。使用外部工具,嗯?另一个问题的公认答案使用纯shell,没有外部工具(尽管Awk通常以某种形式提供),也没有Bash。@tripleee我想我读过
@tripleee,但该解决方案并不能很好地处理循环和迭代,这里给出的解决方案确实如此。谢谢,问题是我不需要打印值,我更喜欢不使用外部工具,我想创建一个更像值数组的东西,并在阅读时将它们3乘3移动。谢谢,问题是我不需要打印值,我更喜欢不使用外部工具,我更喜欢创建一个值数组,并在阅读时将其3乘3移动。这看起来很完美,使用
IFS
使其整洁且易于定制,谢谢+1:QQ不是
[[…]]
bash-construct?@jaypal,在ksh和zsh工作。我想是ksh先做的。感谢@glennjackman提供的信息。说清楚点,我知道
[[]]
语法在
sh
下不起作用,但这篇文章给了我一个正确的提示,让我可以完成我的脚本并支持
sh
。这看起来很完美,如果使用
IFS
,它会变得整洁且易于定制,谢谢+1:QQ不是
[[…]]
bash-construct?@jaypal,在ksh和zsh工作。我想是ksh先做的。感谢@glennjackman提供的信息。我知道
[[]]
语法在
sh
下不起作用,但这篇文章给了我正确的提示,让我完成我的脚本并支持
sh
typeset -a values
typeset -i i=0
echo "$VALUES" | while IFS=' ;' read v1 v2 v3; do
    [[ -z $v1 && -z $v2 && -z $v3 ]] && continue
    values[i]=$v1
    values[i+1]=$v2
    values[i+2]=$v3
    ((i+=3))
done

for i in "${!values[@]}"; do printf "%d\t%s\n" $i "${values[i]}"; done
0   val1
1   val2
2   val3
3   another1
4   another2
5   another3