首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编写一个接受

编写一个接受
EN

Unix & Linux用户
提问于 2018-11-18 09:14:48
回答 2查看 86关注 0票数 -3

编写一个接受两个参数的脚本,firs表示一个前缀字符串,第二个表示路径(假设它是一个绝对路径)。您所编写的脚本必须执行以下操作

如果用户只输入一个参数,即前缀字符串,则必须在工作目录中显示名称以前缀开头的所有文件的列表。如果用户输入两个参数,即前缀字符串和路径。然后,凭证显示以前缀开头的所有目录的列表;在第二个参数指定的路径中。注意,脚本必须在运行脚本之前返回工作目录的值。

EN

回答 2

Unix & Linux用户

发布于 2018-11-18 11:33:52

代码语言:javascript
复制
#!/bin/sh

( cd -- "${2:-.}" && ls -d -- "$1"*${2:+/} )

那是,

  1. 如果没有给出第二个参数,或者如果它是空的,则cd到第二个参数所给的目录,或者.--阻止cd$2中的任何内容解释为选项。
  2. 从第一个参数开始,对所有名称运行ls -d-d禁止列出具有匹配目录名的任何目录的内容。--阻止ls$1中的任何内容解释为选项。如果给出第二个参数,模式将得到一个尾随的/,因此只匹配目录名。

这一切都发生在子subshell中,这样cd就不会更改脚本其余部分的工作目录(我认为这就是最后一句所暗示的)。在任何情况下,脚本都无法更改调用shell的工作目录,除非该shell使用source运行脚本,并且子shell防止这种情况发生。因此,工作目录将恢复(“返回”)到运行脚本之前的状态。

票数 2
EN

Unix & Linux用户

发布于 2018-11-18 11:04:46

这是不可能的在运行脚本之前,不能将工作目录显式地“返回”到该目录。因为脚本没有合理的方式首先更改调用者的工作目录。参见:如何使用脚本更改调用外壳的工作目录?,我忽略了最后一句,继续。

代码语言:javascript
复制
#!/bin/sh
PREFIX="$1"
DIR="$2"
if [ -z "$DIR" ]; then;
    ls -d -- "$1"*
else
    cd -- "$DIR" &&
    ls -d -- "$1"*/
fi

严格来说,cd --并不是必要的。它解决的问题是,以-开头的字符串可以解释为cd命令的选项。

问题是路径是绝对的,因此它总是从/开始,而不是从-开始。cd "$PATH"就足够了。然而,ls --是绝对必要的。

请注意,目录是一种文件类型。只需要脚本的两个参数形式来列出目录。只需一个参数表单就可以列出文件。除了目录和常规文件外,文件还包括块设备、字符设备、套接字和命名管道(也称为"fifo")的特殊文件。

Linux (和其他实现)扩展了文件类型的列表。Linux包括一个“上述任何一个”,我已经看到stat命令打印为"怪异文件“。

票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/482498

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档