后的第一个参数sh -c inline-script
去$0
(这也是用于错误消息),其余进去$1
,$2
...
$ sh -c 'blah; echo "$0"; echo "$1"' my-inline-script arg
my-inline-script: blah: command not found
my-inline-script
arg
所以你要:
sh -c 'find "$1"' sh /tmp
(在过去,您可以找到sh
第一个arg进入的实现$1
,因此您可以执行以下操作:
sh -c 'find "$1"' /tmp /tmp
要么:
sh -c 'shift "$2"; find "$@"' sh 3 2 /tmp1 /tmp2
考虑到这两种行为,但是由于POSIX流行并且可以公开使用,所以这些shell已经消失了)。
如果要在当前shell的本地范围内设置$1
,则可以$2
在其中使用函数。在类似伯恩的贝壳中:
my_func() {
find "$1"
}
my_func /tmp
一些外壳程序支持匿名功能。是这样的zsh
:
(){find "$1"} /tmp
或es
:
@{find $1} /tmp
要永久更改当前位置参数,语法取决于外壳。dchirikov已经涵盖了类似Bourne外壳(伯恩,科恩,bash
,zsh
,POSIX, ash
,yash
...)。
语法为:
set arg1 arg2 ... argn
但是,您需要:
set --
要清空该列表(或shift "$#"
),然后
set -- -foo
设置$1
为以-
或开头的内容+
,因此,总是习惯使用set --
这种习惯,尤其是在使用任意数据(例如set -- "$@" other-arg
在位置参数列表的末尾添加参数)时。
在csh
族(csh
,tcsh
)的外壳程序中,您分配给该argv
数组:
set argv=(arg1 arg2)
在的壳rc
家族(rc
,es
,akanga
),于*
数组:
*=(arg1 arg2)
尽管您也可以单独分配元素:
2=arg2
在fish
,位置参数是在argv
阵列只(无$1
,$@
那里):
set argv arg1 arg2
在中zsh
,为了与兼容csh
,您还可以分配给argv
数组:
argv=(arg1 arg2)
argv[4]=arg4
您还可以执行以下操作:
5=arg5
这意味着您还可以执行以下操作:
argv+=(another-arg)
在末尾添加一个参数,并且:
argv[-1]=()
argv[2]=()
从末尾或中间删除参数,而其他shell则很难做到这一点。
(find $1) /tmp
是语法错误。实际上(any-command) more-arguments
是语法错误。您能以不同的方式解释您要做什么吗?