直接在循环

时间:2015-05-13 18:42:52

标签: bash variables indirection

我的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

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

1 个答案:

答案 0 :(得分:3)

尝试以下方法:

# 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,能够通过另一个包含目标变量名称的变量来间接引用变量间接。< / p>

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

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