编写一个接受两个参数的脚本,第一个表示前缀字符串,第二个表示路径(假设它是绝对路径)。您编写的脚本必须执行以下操作
如果用户只输入一个参数,即前缀字符串,那么它必须显示名称以该前缀开头的所有文件的列表;在工作目录内。如果用户输入两个参数,即前缀字符串和路径。然后脚本显示名称以前缀开头的所有目录的列表;在第二个参数指定的路径内。请注意,脚本必须返回运行脚本之前的工作目录值。
答案1
#!/bin/sh
( cd -- "${2:-.}" && ls -d -- "$1"*${2:+/} )
那是,
cd
到第二个参数给出的目录,或者.
如果没有给出第二个参数,或者它为空,则到。防止--
将cd
任何内容解释$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 为“奇怪的文件”。