The first argument after sh -c inline-script
goes to $0
(which is also used for error messages), and the rest go in $1
, $2
...
$ sh -c 'blah; echo "$0"; echo "$1"' my-inline-script arg
my-inline-script: blah: command not found
my-inline-script
arg
So you want:
sh -c 'find "$1"' sh /tmp
(in the olden days, you could find sh
implementations where the first arg went into $1
instead, so you would do:
sh -c 'find "$1"' /tmp /tmp
Or:
sh -c 'shift "$2"; find "$@"' sh 3 2 /tmp1 /tmp2
to account for both behaviours, but those shells are gone now that POSIX is prevalent and publicly available).
If you want to set $1
, $2
in a local scope within the current shell, that's where you'd use functions. In Bourne-like shells:
my_func() {
find "$1"
}
my_func /tmp
Some shells support anonymous functions. That's the case of zsh
:
(){find "$1"} /tmp
Or es
:
@{find $1} /tmp
To change the current positional parameters, permanently, the syntax is shell dependant. dchirikov has already covered the Bourne-like shells (Bourne, Korn, bash
, zsh
, POSIX, ash
, yash
...).
The syntax is:
set arg1 arg2 ... argn
However, you need:
set --
To empty that list (or shift "$#"
) and
set -- -foo
to set $1
to something starting with -
or +
, so it's a good habit to always use set --
especially when using arbitrary data such as set -- "$@" other-arg
to add arguments to the end of the positional parameter list.
In shells of the csh
family (csh
, tcsh
), you assign to the argv
array:
set argv=(arg1 arg2)
In shells of the rc
family (rc
, es
, akanga
), to the *
array:
*=(arg1 arg2)
Though you can also assign elements individually:
2=arg2
In fish
, the positional parameters are in the argv
array only (no $1
, $@
there):
set argv arg1 arg2
In zsh
, for compatibility with csh
, you can also assign to the argv
array:
argv=(arg1 arg2)
argv[4]=arg4
And you can also do:
5=arg5
That means you can also do things like:
argv+=(another-arg)
to add an argument to the end, and:
argv[-1]=()
argv[2]=()
to remove an argument from the end or the middle, which you can't easily do with other shells.
If you look carefully, you will see that the use of these variables is in a -e
option of the docker-run
command. This option is used to make environment variables available to the container.
So here, the script is specifying the name of the environment variable that should be passed to the container, and not the value itself (for which, as you stated correctly, it would have needed dereferencing, as in $ARCH
or ${ARCH}
).
You can have a look at the docker documentation for further reading.
Best Answer
One way to do it:
Output: