我有一个文件 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))
我怎样才能得到正确的结果?
答案 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
而不是bash
。 cat
形式是POSIX,因此可以移植到所有POSIX shell,而bash形式则不是。