编写一个脚本来生成另一个带有参数的脚本

编写一个脚本来生成另一个带有参数的脚本

我想创建一个脚本,该脚本使用 2 个参数创建另一个脚本。第二个脚本应该使用其自己的参数。我一直遇到的问题是,最后一个 echo 将第一个脚本的参数放入第二个脚本中。那么我该如何让我的第二个脚本接受参数呢?我想知道怎么做这是我的第一个脚本:

#! /bin/bash
MY_FILE=$1
MY_PATH=$2
touch $MY_PATH/$MY_FILE
echo "#! /bin/bash" > $MY_FILE
echo "ps -u $1 -o comm=CMD -o pid,ppid,user,uid,gid" >> $MY_FILE

答案1

如果您阅读 bash shell 的手册,双引号会保留引号内字符的字面值,除了对于“$”、“`”和“\”。因此,您编写的行将替换$1为第一个脚本的第一个参数,而不是在第二个脚本中打印文字“$1”。我相信你想要的是这样的:

#! /bin/bash
MY_FILE=$1
MY_PATH=$2
touch "$MY_PATH"/"$MY_FILE"
echo "#! /bin/bash" > "$MY_FILE"
echo `ps -u $1 -o comm=CMD -o pid,ppid,user,uid,gid` >> "$MY_FILE"

请注意,我还在变量扩展周围添加了双引号,例如"$MY_FILE".这是为了避免混淆,以防存储的字符串包含空格。

但是,我不得不说我不明白你想在这里实现什么:

a) 您打印到第二个脚本的命令不依赖于第一个脚本的参数(在这种情况下,如果需要复制第二个脚本,您可以简单地复制它)。

b) 您所接触的文件touch "$MY_PATH"/"$MY_FILE"可能与您打印其他命令的文件完全不同,因为您没有"$MY_PATH"在这些调用中包含该变量。也许这是预期的行为,但似乎有点奇怪。

答案2

echo 'ps -u $1 -o comm=CMD -o pid,ppid,user,uid,gid' >> $MY_FILE

一般来说,使用此处文档来创建脚本可能会更容易:

cat <<"EOT" >"$MY_FILE"
#! /bin/bash
ps -u $1 -o comm=CMD -o pid,ppid,user,uid,gid
EOT

由于周围的报价,EOT没有任何内容被扩展。

相关内容