bash 使用其余参数

Eul*_*lar 9 shell bash shell-script

我有一个 bash 脚本,它采用名称和命令作为参数。像这样就很简单了

#myscript
echo $1
$2
Run Code Online (Sandbox Code Playgroud)

我这样运行

bash myscripts myjob ls
Run Code Online (Sandbox Code Playgroud)

它将回显“myjob”并运行命令ls。但是当命令是多个单词时,我必须为其提供引号,如下所示

bash myscripts myjob "ls -l"
Run Code Online (Sandbox Code Playgroud)

现在我的问题是,有没有办法编写 shell 脚本,这样我就不必提供引号?就像,把一切都当作我的命令而不是第一个参数?可以用bash来做吗?

Fel*_*xJN 10

是的,您可以用来shift移动以前的参数:

#!/bin/bash
echo "$1"
shift 1
"$@"
Run Code Online (Sandbox Code Playgroud)

shift N将移动计数器,以便跳过参数 1 到 N,参数 N+1 现在为 1,N+2 为 2,依此类推。

请注意,这意味着您的第一个命令 ( myjob) 是单字命令,只有第二个命令 ( ls -l) 可以是多字命令。

  • `$*` 应该是 `"$@"` - 否则如果任何参数是包含 IFS 字符的带引号的字符串,bash 将会对其进行单词分割。例如,如果第二个及后续是 `cp "filename withspaces.txt" "newfile.txt"`,它将变成 `cp filename withspaces.txt newfile.txt` (即,将有 **四个** 文件名参数,而不是两个...三个源文件名和一个目标:“filename”、“with”、“spaces.txt”和“newfile.txt”)。如果任何参数包含 shell 元字符(如“;”或“&”),则会出现更严重的问题。 (3认同)