printf脚本中的格式问题

时间:2015-03-18 06:46:19

标签: linux shell

我有一个文件 stv.txt ,其中包含一些名称
例如 stv.txt 如下:

hello  
world  

我想通过使用这些名称并为它们添加一些额外的文本来生成另一个文件。我编写了一个脚本如下

for i in `cat stvv.txt`; 
do printf 'if(!strcmp("$i",optarg))' > my_file; 
done

输出

if(!strcmp("$i",optarg))  

期望的输出

if(!strcmp("hello",optarg))  
if(!strcmp("world",optarg))

我怎样才能得到正确的结果?

2 个答案:

答案 0 :(得分:0)

这是一个有效的解决方案。

  

1单引号内的所有符号都被视为字符串。
2使用printf时,请勿使用引号括起变量。 (在这个例子中)   

  下面的代码应该修复它,

for i in `cat stvv.txt`; 
   printf 'if(!strcmp('$i',optarg))' > my_file; 
done

基本上,将printf语句分成三部分。

  

1:字符串'if(!strcmp('
  2:$ i(无报价)
  3:字符串',optarg))'

希望有所帮助!

答案 1 :(得分:0)

要将字符串插入printf格式,请在格式字符串中使用%s

$ for line in $(cat stvv.txt); do printf 'if(!strcmp("%s",optarg))\n' "$line"; done
if(!strcmp("hello",optarg))
if(!strcmp("world",optarg))

代码$(cat stvv.txt)将对stvv.txt的内容执行分词和路径名扩展。你可能不希望这样。使用while read ... done <stvv.txt循环通常更安全,例如:

$ while read -r line; do printf 'if(!strcmp("%s",optarg))\n' "$line"; done <stvv.txt
if(!strcmp("hello",optarg))
if(!strcmp("world",optarg))

除了cat

之外

如果您使用的是bash,则可以使用效率更高的$(cat stvv.txt)替换$(<stvv.txt)。但是,此问题标记为shell而不是bashcat形式是POSIX,因此可以移植到所有POSIX shell,而bash形式则不是。