确实,POSIX sh
shell 没有与其他 shell 相同的命名数组bash
,但是有一个shell(以及其他 shell)可以使用的列表,这就是位置参数列表。sh
bash
此列表通常包含传递给当前脚本或 shell 函数的参数,但您可以使用set
内置命令设置其值:
#!/bin/sh
set -- this is "a list" of "several strings"
在上面的脚本中,位置参数$1
, $2
, ... 设置为显示的五个字符串。--
用于确保您不会意外设置 shell 选项(该命令set
也可以这样做)。-
如果第一个参数以虽然开头,这只是一个问题。
例如,循环这些字符串,您可以使用
for string in "$@"; do
printf 'Got the string "%s"\n' "$string"
done
或更短的
for string do
printf 'Got the string "%s"\n' "$string"
done
要不就
printf 'Got the string "%s"\n' "$@"
set
对于将 glob 扩展为路径名列表也很有用:
#!/bin/sh
set -- "$HOME"/*/
# "visible directory" below really means "visible directory, or visible
# symbolic link to a directory".
if [ ! -d "$1" ]; then
echo 'You do not have any visible directories in your home directory'
else
printf 'There are %d visible directories in your home directory\n' "$#"
echo 'These are:'
printf '\t%s\n' "$@"
fi
shift
内置命令可用于从列表中移出第一个位置参数。
#!/bin/sh
# pathnames
set -- path/name/1 path/name/2 some/other/pathname
# insert "--exclude=" in front of each
for pathname do
shift
set -- "$@" --exclude="$pathname"
done
# call some command with our list of command line options
some_command "$@"