【问题标题】:How can I add a default parameter to a `Bash` function?如何向“Bash”函数添加默认参数?
【发布时间】:2021-09-10 04:05:17
【问题描述】:

大多数时候,当我在某个目录中并从命令行运行某些作业时,我喜欢这样做:

ls -ltr | tail -3

确认我期待的文件确实存在。

为避免频繁输入,我添加到我的~/.bach_profile

alias ltr="ls -ltr | tail -3"

Bash doesn't accept 参数,但我们可以写

ltr() {
    ls -ltr "${1}" | tail -3
}

在(比如说)下载某些内容后,可以输入ltr ~/Downloads

但我不能再只输入ltr。我现在必须输入ltr .

如何向Bash 函数添加默认参数?

(我在 macOS 终端中,以防万一。)

【问题讨论】:

    标签: bash function default-value parameter-expansion


    【解决方案1】:

    您可以像这样使用默认参数值:

    ltr() {
       ls -ltr "${1:-.}" | tail -3
    }
    

    如果缺少$1,它将使用. 作为ls -ltr 的参数。

    有了这个,你可以像这样使用:

    ltr ~/Documents
    ltr ~/Downloads
    ltr
    

    Please read this about parsing the output of ls

    【讨论】:

    • Re: 解析 ls: IIUC 的输出,这仅适用于我继承了别人的文件或文件系统的情况。在这种情况下,我需要防止输出错误、错误的命令或彻头彻尾的特洛伊木马程序。但是,如果我是除了系统文件之外添加每个文件(没有异常字符)的人,那么我会更加安全(除了 github 下载的文件等)。对吗?
    • @Sam 是的,在这种情况下你应该没问题
    【解决方案2】:

    这并不完全符合您的要求,但在这种情况下,使用它可能会更好:

    ltr() {
        ls -ltr "$@" | tail -3
    }
    

    "$@" 扩展为传递给ltr 的所有参数,因此您可以传递多个参数...或根本不传递,并且您传递的任何内容都会传递给ls -ltr

    【讨论】:

    • 我想我知道你要去哪里了。设计它可能很方便,使得命令混合两个或多个目录的输出,并按时间戳反向排序,然后将输出传递给 tail。
    • @Sam 对。或者您可以将其他标志传递给ls,例如ltr -ia /path/to/dir 将在列出/path/to/dir 时包含不可见文件和inode 号。
    猜你喜欢
    • 2011-01-20
    • 2016-12-08
    • 1970-01-01
    • 2010-09-23
    • 2016-07-15
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    相关资源
    最近更新 更多