编写一个接受[关闭]的脚本

编写一个接受[关闭]的脚本

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

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

答案1

#!/bin/sh

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

那是,

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

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

答案2

这不可能。您无法显式地将工作目录“返回”到运行脚本之前的位置。因为脚本首先没有合理的方法来更改调用者的工作目录。看:如何使用脚本更改调用shell的工作目录? 我忽略最后一句话并继续。

#!/bin/sh
PREFIX="$1"
DIR="$2"
if [ -z "$DIR" ]; then;
    ls -d -- "$1"*
else
    cd -- "$DIR" &&
    ls -d -- "$1"*/
fi

cd --并不是绝对必要的。它解决的问题是以 a 开头的字符串-可以解释为cd命令的选项。

问题说路径是绝对的,因此它将始终以 开头/,并且永远不会以 开头-cd "$PATH"就足够了。然而,ls -- 绝对必要的。

请注意,目录是一种文件类型。仅需要列出目录时才需要脚本的两个参数形式。仅需要单参数形式来列出文件。除了目录和常规文件之外,文件还包括块设备、字符设备、套接字和命名管道(又名“fifo”)的特殊文件。

Linux(和其他实现)扩展了文件类型列表。 Linux 包括一个“以上都不是”的命令,我看到stat命令 print 为“奇怪的文件”。

相关内容