我希望能够运行一个 bash 脚本,让它列出可能的文件作为选项来选择一个,然后通过 scp 将该文件传输到目标......
scp 部分没问题,但我如何获得文件列表并能够选择一个对我来说是具有挑战性的......
$ ./script
Please select a file.
[0] ~/Desktop/ScreenShot-04-06-19-01:02:33.png
[1] ~/Desktop/ScreenShot-04-06-19-01:03:33.png
[2] ~/Desktop/ScreenShot-04-06-19-01:04:33.png
Enter File Index ID:
另一种方法是使用 select from bash :
你这样称呼它:
PS:将 script 重命名为 myscript 因为 script 是一个命令。
看
man script
要提供一个交互式菜单,
bash
用户可以从中选择多个文件路径名,您可能需要使用以下内容:在这里,我们使用
bash
语句select
来提供菜单,并使用PS3
第三级提示来提供自定义提示。0
用户可以通过在提示符处输入退出脚本而不从列表中选择文件。如果给出了无效的响应,用户将有另一个机会选择一个文件。Enter在提示符处按下可重新显示菜单。循环内部的逻辑如何
select
制定并不重要,只要脚本在$REPLY
(用户输入的实际值)为空时终止,并在(从数组中选取的值)为空0
时重试。$file
另一种select
语句体可能看起来像文件名通过 shell glob 插入到命名数组中。您还可以使用从脚本的命令行获取相关文件
在 POSIX shell 中,您通常无权访问命名数组或
select
. 相反,你可以做类似的事情这是一个相当常见的输入循环,它会迭代直到用户输入有效的条目(或直到
0
输入并且脚本退出)。每次输入错误都会重新显示菜单。路径名通过 shell glob 被带入位置参数列表,就像在
bash
变体中一样,但是菜单是手动打印的,每个输出的菜单条目都会增加一个整数。shift
末尾的 将位置参数列表开头的条目移开,以便成为$1
用户想要上传的路径名。要改为使用命令行上给出的路径名,只需删除初始
set
命令。这就是我在 bash 脚本中的做法(也适用于 POSIX
sh
脚本):