shell如何通过循环构造字符串[duplicate]

xqkwcwgp  于 2022-12-04  发布在  Shell
关注(0)|答案(1)|浏览(162)

此问题在此处已有答案

When to wrap quotes around a shell variable?(5个答案)
2天前关闭。
我需要构造redis虚拟数据,在构造redis hash数据时,我希望通过for循环构造a large number of fields的哈希数据。
我直接调用printf结构来获得所需的结果,但是当存储在变量中时,结果并不是预期的那样,示例代码如下所示

#!/bin/bash
for no in $(seq 5); do
    printf "%s%s %s " "$data" "filed$no" "val$no"
done
# stdout: 
# bash test.sh
filed1 val1 filed2 val2 filed3 val3 filed4 val4 filed5 val5

保存到变量

#!/bin/bash
data=""
for no in $(seq 5); do
    data="$(printf "%s%s %s " "$data" "filed$no" "val$no")"
done
printf "%s\n" $data

# stdout
# bash test.sh 
filed1
val1
filed2
val2
filed3
val3
filed4
val4
filed5
val5

这似乎是逃避空格到换行符,我怎么能解决它?我真的很感谢任何帮助与此。

f87krz0w

f87krz0w1#

引用变量:

printf "%s\n" "$data"

如果不加引号,$data会展开成数个参数。printf会重复使用格式规范来做为所有参数。
请参阅printf:

必要时会重复使用此格式,以使用所有参数。如果格式需要的参数比提供的多,则额外的格式规格会视情况视为已提供零值或Null字串。成功时传回值为零,失败时传回非零。

简单演示:

$ printf "hello %s\n" a b c
hello a
hello b
hello c
$ printf "hello %s\n" "a b c"
hello a b c
$

相关问题