从脚本内部访问在终端上发出的确切命令以触发相关脚本

从脚本内部访问在终端上发出的确切命令以触发相关脚本

假设我发出以下命令:

./myscript.sh file* test.txt

现在,我希望myscript.sh能够创建一个变量,比如howiwasran,这样如果它是echo ${howiwasran},那么除了脚本的路径和名称之外,输出应该与命令行中输入的内容完全一致。因此输出应该只是:

file* test.txt

我了解 noglobbing,以及在引号内传递参数,然后也在脚本内使用引号,但我想要一些在更深层次上起作用的东西。

即使设置了实时更新,我也无法使用历史文件来做到这一点。

截至目前,这种需求是可以避免的,但我仍然很好奇。

答案1

你可以这样做:

howiwasran="${@: 2}"

在 bash 中,$@是一个 bash 参数数组,包括脚本名称($@类似于argvC/C++ 中的)。

这里的冒号用于表示数组的偏移量。我在 和 之间加了一个空格,:因为2

${var:-2}

有不同的含义:

${parameter:-word} 使用默认值。如果参数未设置或为空,则替换 word 的扩展。否则,替换参数的值。

来源

因此,在和数字之间留一个空格:可确保您可以在数组中产生负偏移,类似于在 python 中使用负数组索引。

请注意,此语法在 中无效sh。如果将此语法与 一起使用sh,将会出现Bad substitution错误。

还要注意file*,如果不加引号,shell 会使用通配符将其扩展。通配符将应用于脚本已启动,因此脚本将不会file*在其内看到$@,而是会看到类似的内容file1 file2 file3 ...

相关内容