将多个参数传递给shell包装器中的命令

将多个参数传递给shell包装器中的命令,shell,Shell,我正在尝试编写一个自定义命令,将文件复制到特定目录中。 我不确定这样做的最佳方式。现在,剧本是这样的 #!/bin/sh cp -rf $1 /support/save/ 我调用了这个命令filesave,它对一个文件非常有效,但是如果您使用*.sh或类似的命令,它只复制第一个文件。这是有道理的,因为这就是1美元的意义所在。是否有一个输入变量只收集所有输入,而不仅仅是特定的输入 #!/bin/sh cp -rf -- "$@" /support/save 使用“$@”展开到整个参数列表。必须

我正在尝试编写一个自定义命令,将文件复制到特定目录中。 我不确定这样做的最佳方式。现在,剧本是这样的

#!/bin/sh
cp -rf $1 /support/save/
我调用了这个命令
filesave
,它对一个文件非常有效,但是如果您使用*.sh或类似的命令,它只复制第一个文件。这是有道理的,因为这就是1美元的意义所在。是否有一个输入变量只收集所有输入,而不仅仅是特定的输入

#!/bin/sh
cp -rf -- "$@" /support/save
使用
“$@”
展开到整个参数列表。必须将其置于双引号中,否则其行为将与
$*
相同(也就是说,不正确)

--
是一个广泛实现的扩展,它确保以下所有参数都作为文本参数处理,而不是作为选项解析,从而使以
-
开头的文件名变得安全


要演示差异,请将以下脚本命名为
quotdemo

#!/bin/sh
printf '$@: '; printf '<%s>\n' "$@"
printf '$*: '; printf '[%s]\n' $*

你试过曼什吗?与这个问题相关的文档通常是相当清楚的。我正在查找,但目前对我没有太大帮助。我是scripting.BTW新手,
cp-rf$1/support/save
也不能处理带空格的文件名。即使只使用一个参数,也需要
cp-rf“$1”/support/save
,以避免字符串拆分和全局扩展。将捕捉到这种错误;此外,如果您可以使用bash而不是posixsh,请参阅SO()上的bash标记wiki,以获得一些指向优秀初学者文档的指针。(事实上,这些文档中的许多甚至对瞄准基线POSIX sh的用户都很有用;例如,Wooledge wiki在使用扩展时指出了这一点)。感谢Charles,我可以使用bash,您如何使用bash?同样,对于这个简单的案例;bash的任何扩展在这里都不是很重要,因此我使用另一个与cp相反的命令从/support/save到当前目录的文件列表。我的命令是cp-rf--/support/save/“$@”。当我尝试使用它时,我没有得到这样的文件或目录。
/support/save/“$@”
仅在数组中第一个名称的路径前面加上前缀。有关详细信息,请参阅。
touch foo.txt bar.txt "file with spaces.txt" # create some matching files
quotdemo *.txt    # ...then test this...
quotdome "*.txt"  # ...and this too!