【问题标题】:Add spaces to variable in shell script在 shell 脚本中为变量添加空格
【发布时间】:2013-02-04 06:18:50
【问题描述】:

我想从 sh 脚本创建一个 yaml 配置文件。所以我需要向这样的变量添加多个空格:

SERVERS=""
for i in $(seq 1 5); do
    SERVERS="$SERVERS      -server`printf "%03d" $i`.$URL\n"
done

但是空格减少到只有一个空格。如何确保空格不被替换?

【问题讨论】:

  • 请注意,您没有在字符串中添加换行符;您正在添加两个文字字符“\”和“n”。
  • 我已经意识到了这一点。当我通过 echo "$SERVERS" 打印变量时,\n 被解释为换行符,但是当我将它存储在文件中时,它只是转储 "\n"。如何进行真正的换行?

标签: shell sh spaces


【解决方案1】:

我怀疑你在回显 $SERVER =) 时忘记使用双引号

SERVERS=""
for i in $(seq 1 5); do
    SERVERS="$SERVERS      -server$(printf "%03d" $i).$URL\n"
done
echo "$SERVER"

输出:

      -server001.\n      -server002.\n      -server003.\n      -server004.\n(...)

这就是(不那么)了不起的word splitting的规则


使用 的另一种解决方案:

perl -le 'for (1..5) { print "   -server$_"}' | tee -a file.yaml

或者使用

awk 'BEGIN{for (i=1; i<=5; i++) print "   -server"++c}'  |
    tee -a file.yaml

【讨论】:

  • 谢谢,我真的忘记加双引号了。
【解决方案2】:

你最终会用SERVERS 做什么?与其尝试构建多行字符串,不如这样做可能会更好:

for i in $(seq 1 5); do
    echo "     -server$(printf "%03d" $i).$URL"
done >> file

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多