我有一个叫做dosmt的脚本,我会输入一些参数并打印一些内容:
if [ "${@: -1}" == "--ut" ]; then
echo "Hi"
fi
我想做的是,如果条件为真,则删除最后一个位置参数
--ut
。因此,如果我的输入是$ dosmt hello there --ut
,它将回显Hi
,但如果我在之后打印args,我只想保留hello there
。所以基本上我想永久删除最后一个参数,我尝试使用shift,但那只是临时的,所以不起作用...首先,让我们设置你想要的参数:
$ set -- hello there --ut
$ echo "$@"
hello there --ut
现在,让我们移除最后一个值:
$ set -- "${@: 1: $#-1}"
$ echo "$@"
hello there
为了在脚本中演示这个功能:
$ cat script
#!/bin/bash
echo Initial values="$@"
set -- "${@: 1: $#-1}"
echo Final values="$@"
$ script hello there --ut
Initial values=hello there --ut
Final values=hello there
hello
)开始到最后一个位置的参数(即there
)之间的所有内容”,对吗? - Girrafish
[ ]
中使用==
不能保证 POSIX 能够正常工作;标准提供的唯一字符串比较运算符是=
。请参阅 http://pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html。 - Charles Duffy--utc
等选项,以便它们始终可以被移除;允许它们出现在任何地方是GNU的一种特性。 - Charles Duffyls * -l
可以正常工作,除非使用了--
,但为了防止处理以破折号开头的文件名时出现意外行为,编写供健壮脚本使用/调用的工具的人应该使用--
。 因此,ls -l -- *
是正确的方法,允许以这种方式使用--
可保留工具从足够谨慎的脚本中被调用的功能。 设计一个调用约定以防止遵循最佳实践的行为是失败设计。 - Charles Duffy