【问题标题】:Operate on variables in Bash directly in a loop直接循环操作 Bash 中的变量
【发布时间】:2015-07-25 05:11:05
【问题描述】:

我的 googlefu 让我失望了。我有一堆变量,我从 CSV 中读取它,我想在其中去除空格。我可以

variable1="$(echo -e "${variable1}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')"
variable2="$(echo -e "${variable2}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')"
variable3="$(echo -e "${variable3}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')"

但是我会为每个变量更改复制并编辑它。在我看来,从其他语言来看,应该有一种方法可以执行一个简单的 for 循环,该循环适用于命名的变量并去除空格,但我不知道该怎么做。

for $i in variable1 variable2 variable3
do
$i=$(echo -e "${$i}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')
done

但据我所知,这不起作用。我想要做的是遍历所有变量,去掉空格,但不必在脚本中手动输入每个变量名。

【问题讨论】:

  • 请注意,在 shell 代码中,变量名称仅在您引用变量时使用$-前缀,而不是在您定义_/_分配给时它;因此,它应该是for i in ...i=$(...)

标签: bash variables indirection


【解决方案1】:

尝试以下方法:

# Sample values that need trimming.
variable1='  a  '
variable2='      b  c  '
variable3='        sadf sdf sdf     '

for name in ${!variable*}; do
  # Trim leading and trailing whitespace.
  read -r $name <<<"${!name}"
  # Print result
  echo "Variable $name now contains: [${!name}]"
done

解决方案依赖于variable indirection,即通过包含目标变量名称的另一个变量间接引用变量的能力。

请注意,变量间接寻址有其缺陷(请参阅链接),并且通常有更好的解决方案,例如,通过使用数组。

  • ${!variable*} 扩展为所有以variable 开头的已定义变量的名称。
  • ${!name} 扩展为变量的值,其名称存储在变量 $name 中。
  • read -r,通过读入 single 变量,隐式修剪前导和尾随空格。
    • -r 确保 \ 字符。在输入中保持独立,这通常是您想要的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-23
    • 1970-01-01
    • 2013-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-21
    • 1970-01-01
    相关资源
    最近更新 更多