【问题标题】:parameter expansion with separator in the sh and ksh shell [duplicate]在 sh 和 ksh shell 中使用分隔符进行参数扩展 [重复]
【发布时间】:2014-03-25 20:34:46
【问题描述】:

我有一个类似于在这个问题中解决的问题:How do I split a string on a delimiter in Bash?

真正的区别在于我的目标是 shksh shell,因此,例如,我不能使用 <<< 重定向。

回顾我的问题,我有一个变量的内容是

VALUES="
val1    ;val2    ;val3
another1;another2;another3
"

很明显,空格; 是我想去掉的字符。

我还必须使用这些值,因为它们以 3 x 3 的形式出现,当时为 3,但我假设我可以简单地使用 $1,$2$3 在扩展后加上每个循环结束时的shift 3

谢谢。

【问题讨论】:

  • @blueberryfields 我想这会奏效,但最好讨论一些不需要任何外部工具的东西,看看shksh 是否可行,使用外部工具并不像针对特定的外壳,它只是......使用外部工具。
  • 嗯?另一个问题的公认答案使用纯 shell,没有外部工具(尽管 Awk 通常以某种形式提供)并且没有 Bash。
  • @tripleee 我猜我把<<读成<<<;但你是对的,这也应该有效,我以某种方式错过了......
  • @tripleee 但该解决方案并不能很好地应对循环和迭代,这里给出的解决方案可以。

标签: shell sh ksh


【解决方案1】:
VALUES="
val1    ;val2    ;val3
another1;another2;another3
"
echo "$VALUES" | while IFS=' ;' read v1 v2 v3; do 
    [[ -z $v1 && -z $v2 && -z $v3 ]] && continue
    echo "v1=$v1  v2=$v2  v3=$v3"
done
v1=val1  v2=val2  v3=val3
v1=another1  v2=another2  v3=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
0   val1
1   val2
2   val3
3   another1
4   another2
5   another3

【讨论】:

  • 这看起来很完美,使用IFS 使其整洁且易于定制,谢谢!
  • +1: QQ 不是[[..]] bash 构造?
  • @jaypal,在 ksh 和 zsh 中工作。我认为 ksh 首先做到了。
  • 感谢@glennjackman 提供的信息。
  • 要清楚我知道[[ ]] 语法在sh 下不起作用,但是这篇文章给了我正确的提示来完成我的脚本并支持sh .
【解决方案2】:

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

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

【讨论】:

  • 谢谢,问题在于我真的不需要打印这些值,而且我宁愿不使用外部工具,我想创建更像一个值数组的东西并在阅读时将它们 3 x 3 移动。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-21
  • 2015-01-02
  • 1970-01-01
  • 2020-03-16
  • 1970-01-01
相关资源
最近更新 更多