假设我有这个脚本:
x-terminal-emulator -e bash -c 'echo hello > ~/text'
我将其命名为 foo.sh 并使其可执行。
如果执行此脚本,我的主文件夹中将有一个包含单词“hello”的文本文件。
现在如果我将其修改为:
x-terminal-emulator -e bash -c 'echo $1 > ~/text'
...我在这样的终端中执行它:
./foo.sh hello
我的主文件夹中有一个文本文件,其中不包含任何内容。
foo.sh 接收“hello”作为第一个也是唯一的参数 ($1)。那么为什么 bash 没有收到它呢?有没有一种方法可以将一个或多个参数从 foo.sh 传递到 bash ?
我尝试将参数存储在变量名中,然后将其导出,但它没有改变结果。
答案1
从man bash
-c If the -c option is present, then commands are read from the
first non-option argument command_string. If there are
arguments after the command_string, they are assigned to the
positional parameters, starting with $0.
所以你可以做
x-terminal-emulator -e bash -c 'echo $0 > ~/text' "$1"
或者(如果您希望保留参数的“通常”编号)
x-terminal-emulator -e bash -c 'echo $1 > ~/text' _ "$1"
其中_
可以替换为您选择的任何虚拟变量。
答案2
在 中bash -c 'echo $1 > ~/text'
,$1
是在bash -c
进程中扩展的,而不是在您的脚本中扩展的。您需要将原件传递$1
至bash -c
:
x-terminal-emulator -e "bash -c 'echo \$1 > ~/text' bash $1"