【问题标题】:Assign fields to variables - Bash [duplicate]将字段分配给变量 - Bash [重复]
【发布时间】:2018-12-18 10:30:40
【问题描述】:

假设我有一个带管道分隔符的字符串:

str="1|2|3|4"

我希望将它们分配给特定的变量。

var_a=1
var_b=2
var_c=3
var_d=4

我是这样做的:

var_a="`echo $str | cut -d'|' -f1`"
var_b="`echo $str | cut -d'|' -f2`"
var_c="`echo $str | cut -d'|' -f3`"
var_d="`echo $str | cut -d'|' -f4`"

这可以有效地完成吗?请提出建议。

【问题讨论】:

  • 用数组代替五个不同的变量可以吗?
  • 顺便说一句,echo $str 本身就是错误的; echo "$str" 稍微好一点(例如,不会用文件名列表替换 *); printf '%s\n' "$str"好多更好(适用于所有可能的值,包括-n-eecho 的某些版本会使用这些值)。请参阅BashPitfalls #14the POSIX echo specification 的应用程序部分。

标签: bash unix


【解决方案1】:

最好使用数组来存储单独的分隔值:

str="1|2|3|4"
IFS='|' read -ra arr <<< "$str"

#examine array values
declare -p arr

declare -a arr='([0]="1" [1]="2" [2]="3" [3]="4")' 

要遍历数组,请使用:

for i in "${arr[@]}"; do echo "$i"; done

1
2
3
4

【讨论】:

  • 假设 OP 真的想读取完全可变数量的项目,这是公平的。我不确定我们是否知道情况是这样,而四个具有不同含义的特定字段。
  • 是的,我只是建议了一个替代方案,假设输入中的分隔值数量可变。
  • 谢谢。我将为此使用数组。
【解决方案2】:
IFS='|' read -r var_a var_b var_c var_d rest <<<"$str"

rest 是在前四列之后获取更多列的变量,如果存在其他列的话。如果您只是想丢弃它们,用于占位符变量的常规名称是_

这在BashFAQ #1: How can I read a file (data stream, variable) line-by-line (and/or field-by-field)?中有详细介绍

【讨论】:

  • 真棒单行
猜你喜欢
  • 1970-01-01
  • 2012-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-12
  • 1970-01-01
  • 2014-07-25
相关资源
最近更新 更多