如何使用shell脚本创建包含某些特定内容的文件?

如何使用shell脚本创建包含某些特定内容的文件?

在 shell 脚本中,我需要创建一个包含某些特定内容的文件。我该怎么做?可以使用 来完成吗cat

答案1

可以通过cat此处文档来完成:

cat >outfilename <<END_FILE
this is the contents of the file

       la-di-da!

END_FILE

这里的文档是位于和末尾<<END_FILE相应文档之间的内容。END_FILE结尾END_FILE必须是该行中唯一的单词,并且必须放置在行的开头。该词END_FILE可以是任何词(例如END_CONFIG_FILEWHEN_WILL_SUMMER_COME或任何有意义的词)。

变量将在文档中展开。如果不需要,请引用第一个此处文档分隔符:

cat >outputfilename <<'MY_DOC'
another here document thingy

     The $PATH variable will not be expanded here
MY_DOC

从技术上讲,此处文档是重定向在上面的示例中,我们将其重定向到cat命令中。该cat命令使用标准输出重定向将其传递到指定文件。

另请参阅标记为的问题在这个网站上。


来自评论:“我明白了没有权限并且sudo没有帮助”

是的,如果您没有目录的写入权限,则无法重定向到输出文件。此外,输出文件的创建sudo甚至发生在调用之前,因此使用sudo不会有帮助。

你可以做

sudo tee outputfilename >/dev/null <<MY_DOC
contents of file
goes here
MY_DOC

这将以teeroot 身份运行,并将在当前目录中tee创建(以 root 身份)。outputfilename重定向到/dev/null是为了停止tee将文档输出到终端。

tee命令将其输入复制到其命令行上命名的所有文件以及标准输出(如果未通过管道传输到另一个命令,则为终端)。

答案2

对于任意(不一定是文本)内容,您可以使用uudecode

uudecode << "EOF" | gunzip > some-file
begin 644 -
M'XL(``S*N%H``ZMW]7%C8F1D@`%F!CL&$.]"&(3O`!7W8&>"JW%@L&#@!)*R
M##(,;$`^*Y(Z=/H'(RK-`;>'@8$%B"V@QJ+3,@RH-",2S<J`&[QXPHA",S`H
MP/6!W#KA,T1\PF=%%+I""**Z0)4!11\35-^-OQ!]-_XJHM`?H-9\0/,?"Q2'
M0/V#3KLPH-(L4#K@:4D*B+U@/<1`=+H%:@&,AND+!.ICPP@-W$``2@=![<,5
M+@4\#"@T+%3U<S*3S$ST<U)T<S+S2BMT*RS,=,U,](KS]8S`;A*`JG7W"P6K
MAX6C`M3-(@R0-`"25^T\MOA2RP9MCB/-5_Z?6'QD>\KV8D&@7`54'SL0+UOH
MP2'$N$Y>XXJ`\`H6A@D@N4H@K@+B&B"N`^(&(&X$XF8@;H6ZLQV(.Y'\W06E
MNX%X;T#9O->7W_,9'?DNM+/W(]^T!9W3;Q9&R.QZ/*GFO$YRT>09-FNW_6)\
M[=_WM][)]>H;RT_=,CYV2[F?)CE^9;*KC]Z\Z+M0?=:LTM[C#Q(T97MD&/``
C?Z"GA;"('V?"+OX1A[@'(W;Q<&;LXINAY@``J665NN@#````
`
end
EOF

该输出(在我的系统上的前 1000 个字节上面的示例中/bin/ls)是使用gzip < file | uuencode -.

相关内容