我正在编写一个脚本,该脚本将字符串作为输入以及用户可以通过使用参数作为指示符来选择的其他选项。换句话说,是这样的:
./script "My input string" -pxz
Run Code Online (Sandbox Code Playgroud)
或者
./script -pxz "My input string"
Run Code Online (Sandbox Code Playgroud)
但我遇到了以下问题。输入非 getopts 样式的参数后, getopts 命令似乎停止工作。检查一下,例如:
#!/bin/bash
while getopts "ab" arg; do
echo $arg received
done
Run Code Online (Sandbox Code Playgroud)
当我们运行它时,我们得到:
$ ./example.sh -a -b -a string -b
a received
b received
a received
$
Run Code Online (Sandbox Code Playgroud)
它停在“string”处并且不会继续。getopts 命令返回非零退出状态,因为“string”不是它期望读取的参数类型,并且 while 循环结束。我尝试添加第二个,while getopts
但这没有任何作用。getopts 的“读头”仍然停留在该“字符串”参数上,并且将再次以非零退出状态退出。
这意味着,看起来,我无法让用户先输入字符串,然后输入选项,因为 getopts 永远无法读取字符串并到达那里。所以我不能这样做:
./script "My input string" -pxz
Run Code Online (Sandbox Code Playgroud)
另一方面,如果我告诉用户首先输入他们的选项,然后输入字符串,我就会遇到如何检索字符串的问题。通常,如果没有选择,我会这样做:
string="$1"
Run Code Online (Sandbox Code Playgroud)
但现在由于有选项,而且我不知道有多少个,我不再知道字符串占据什么位置。那么我怎样才能找回它呢?
现在,理想情况下,我的脚本实际上应该能够以这两种方式甚至两者的组合来工作。它应该能够处理如下输入:
./script -p "My input string" -xz
Run Code Online (Sandbox Code Playgroud)
那么我该如何解决这个问题呢?
升级到新的 Plasma 5.21 后,我注意到的一件事是,每当我将某些内容复制并粘贴到 Konsole 中时,它就会自动突出显示。我很好奇是否有办法关闭此功能。是否有配置文件或设置在某处?
谢谢!