shell 的参数列表只是一个字符串序列。无法使第一个字符串未定义而第二个字符串被定义,但是如果您可以控制程序,或者编写程序的人预料到了这种情况,那么它可能支持传递空的第一个参数,或者可能是被解释为“未定义”的特定字符串。
要传递空字符串,shell 允许您放置两个相邻的引号(在将参数传递到您正在运行的程序之前,shell 将通过 shell 通常处理引号的方式删除这两个引号) 。
program '' second third fourth
Run Code Online (Sandbox Code Playgroud)
一个常见的相关约定是让一个单破折号或双破折号表示“不是选项的选项”。
program -- second third fourth
Run Code Online (Sandbox Code Playgroud)
如果您可以控制命令及其参数处理(并且它还没有得到巩固,因为您有其他人编写的程序取决于当前的行为),更好的设计是使可选参数真正可选,即可能使第一个参数是破折号选项。
program --uppercase string of arguments
program --lowercase STRING OF SHOUTING
program The arguments will be passed through WITHOUT case conversion
Run Code Online (Sandbox Code Playgroud)
实现很简单:
toupper () { tr '[:lower:]' '[:upper:]'; }
tolower () { tr '[:upper:]' '[:lower:]'; }
case $1 in
--uppercase) shift; toupper;;
--lowercase) shift; tolower;;
*) cat;;
esac <<<"$@"
Run Code Online (Sandbox Code Playgroud)
如果行为得到巩固,前进的方法是创建一个具有相同核心行为但具有更好命令行语义的不同名称的命令,并最终逐步淘汰具有笨拙参数处理的旧版本。