假设我发出以下命令:
./myscript.sh file* test.txt
现在,我希望myscript.sh
能够创建一个变量,比如howiwasran
,这样如果它是echo ${howiwasran}
,那么除了脚本的路径和名称之外,输出应该与命令行中输入的内容完全一致。因此输出应该只是:
file* test.txt
我了解 noglobbing,以及在引号内传递参数,然后也在脚本内使用引号,但我想要一些在更深层次上起作用的东西。
即使设置了实时更新,我也无法使用历史文件来做到这一点。
截至目前,这种需求是可以避免的,但我仍然很好奇。
答案1
你可以这样做:
howiwasran="${@: 2}"
在 bash 中,$@
是一个 bash 参数数组,包括脚本名称($@
类似于argv
C/C++ 中的)。
这里的冒号用于表示数组的偏移量。我在 和 之间加了一个空格,:
因为2
像
${var:-2}
有不同的含义:
${parameter:-word} 使用默认值。如果参数未设置或为空,则替换 word 的扩展。否则,替换参数的值。
(来源)
因此,在和数字之间留一个空格:
可确保您可以在数组中产生负偏移,类似于在 python 中使用负数组索引。
请注意,此语法在 中无效sh
。如果将此语法与 一起使用sh
,将会出现Bad substitution
错误。
还要注意file*
,如果不加引号,shell 会使用通配符将其扩展。通配符将应用于前脚本已启动,因此脚本将不会file*
在其内看到$@
,而是会看到类似的内容file1 file2 file3 ...
。