首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从bash脚本生成bash脚本

从bash脚本生成bash脚本
EN

Stack Overflow用户
提问于 2015-08-18 16:02:46
回答 1查看 601关注 0票数 2

我需要从脚本中生成脚本,但是有问题,因为新脚本中的一些命令是被解释的,而不是写入到新文件中。例如,我想在其中创建一个名为start.sh的文件,我想将一个变量设置为当前的IP地址:

代码语言:javascript
复制
echo "localip=$(ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | cut -f1  -d'/')" > /start.sh

写入文件的内容是:

代码语言:javascript
复制
localip=192.168.1.78

但我想要的是新文件中的以下文本:

代码语言:javascript
复制
localip=$(ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | cut -f1  -d'/')"

以便在运行生成的脚本时确定IP。

我做错什么了?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-18 16:05:07

你让这件事变得没必要。使用带有引号的heredoc来传递文字内容,而不需要任何类型的扩展:

代码语言:javascript
复制
cat >/start.sh <<'EOF'
localip=$(ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | cut -f1  -d'/')
EOF

使用<<'EOF'<<\EOF (而不是只使用<<EOF )是必不可少的;后者将执行扩展,就像您的原始代码一样。

顺便说一句,如果您要写给start.sh的任何东西都需要基于当前变量,那么一定要使用printf %q来安全地转义它们的内容。例如,将当前的$1$2等设置为在start.sh执行期间处于活动状态:

代码语言:javascript
复制
# open start.sh for output on FD 3
exec 3>/start.sh

# build a shell-escaped version of your argument list
printf -v argv_str '%q ' "$@"

# add to the file we previously opened a command to set the current arguments to that list
printf 'set -- %s\n' "$argv_str" >&3

# pass another variable through safely, just to be sure we demonstrate how:
printf 'foo=%q\n' "$foo" >&3

# ...go ahead and add your other contents...
cat >&3 <<'EOF'
# ...put constant parts of start.sh here, which can use $1, $2, etc.
EOF

# close the file
exec 3>&-

这比在每个需要追加的行上使用>>/start.sh要高效得多:使用exec 3>file,然后>&3只打开文件一次,而不是在每个生成输出的命令打开它一次。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32077318

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档