String 重新引用传递给bash函数的字符串

String 重新引用传递给bash函数的字符串,string,bash,git,function,String,Bash,Git,Function,我试图创建一个函数来创建git提交 function commit_thing { git add $1 shift git commit $@ } 我不能引用$@,因为我试图保留为提交创建主题和主体的能力。例如: commit_thing thing1.txt -m "This is a subject" -m "This is a detailed body" 我应该如何传递其余的变量,以便引用最初以引号传递给函数的变量,而不引用需要传递给git commit命令

我试图创建一个函数来创建git提交

function commit_thing {
    git add $1
    shift
    git commit $@
}
我不能引用$@,因为我试图保留为提交创建主题和主体的能力。例如:

commit_thing thing1.txt -m "This is a subject" -m "This is a detailed body"
我应该如何传递其余的变量,以便引用最初以引号传递给函数的变量,而不引用需要传递给git commit命令的标志?

美元的全部目的是允许单个参数保留引号,但保持不同。比较

$ set -- "a b" "c d"
$ printf '%s\n' "$*"
a b c d
$ print '%s\n' "$@"
a b
c d
所以你只需要写

function commit_thing {
    git add "$1"
    shift
    git commit "$@"
}

使用像commit_thing thing1.txt-m这样的命令,这是一个主题-m这是一个详细的主体,5个参数是thing1.txt,-m,这是一个主题,-m,这是一个详细的主体。移位后,$@将按原样将剩余参数作为单独的参数传递给git commit,而不是像$*那样只传递一个参数。

使用单引号“这是一个主题”如果您的示例确实是您想要实现的,您不需要函数,它将与:git commit-m这是一个主题-m这是一个详细的主体内容1.txtQuoting$@正是您实现这一点的方式;这就是$@存在于$*。@PatrickMevzek它实际上比试图这样做更滥用git,所以不是一个好的1对1的例子,但影响是一样的。@NDGeek我不是说这样做是一个好主意,我总是建议相反,我只是说如果这真的是它的功能,它不需要,因为git可以在一个命令中完成。