如何检查Bash函数是否有参数?

如何检查Bash函数是否有参数?,bash,.bash-profile,bash-function,Bash,.bash Profile,Bash Function,快速提问。我喜欢emacs。我讨厌输入东西,所以我喜欢用e调用emacs 以前我将.bash_配置文件(OS X)配置为:alias e=“emacs.”。然而,当我只想编辑一个文件时,我已经厌倦了仍然必须键入emacs{file} 所以我试着在谷歌上搜索一下,但是bash抱怨[]: ###smart emacs, open file, or if none, dir e() { if [$1]; then emacs $1 else emacs

快速提问。我喜欢emacs。我讨厌输入东西,所以我喜欢用
e
调用emacs

以前我将.bash_配置文件(OS X)配置为:
alias e=“emacs.”
。然而,当我只想编辑一个文件时,我已经厌倦了仍然必须键入emacs{file}

所以我试着在谷歌上搜索一下,但是bash抱怨
[]

###smart emacs, open file, or if none, dir 
e()
{
    if [$1]; then
        emacs $1
    else
        emacs .
    fi
}
我想用它来做:
e something.c
或者,只是
e

试试看

#!/bin/bash                       

###smart emacs, open file, or if none, dir
e()
{
    if [[ -z "$1" ]]; then # if "$1" is empty
        emacs .
    else
        emacs "$1"
    fi
}
我认为bash在空间方面非常独特。我甚至感到惊讶的是,允许您省略函数名和()之间的空格。(另外,使用$@应该可以打开您传递的所有文件。)


ETA:最好检查参数的数量,如果是
e”“foo.txt

,那么这是否为,如果参数的数量($#?)大于或等于1,则将其全部打开?很抱歉,如果这是显而易见的,我对bash函数很陌生。@Josh:我很担心这个问题。。。区别在于(我相信)使用$*,e foo bar将打开“foo bar”,而$@将打开foo和bar,即拆分为单独的单词。这里有一个更完整的解释:@Josh:是的。文件名中的空格和引号使我尽可能避免接触它们。啊,太好了!最后一个问题,为什么要使用“$@”左右的“?我看到那个页面说你/应该/在$@上使用它们,但你/必须/在$*上使用它们。为什么会这样?@Ulrich当$*和$@不带引号时,$@和$@之间没有区别,$@带双引号,“$@”是“$1”$2”…,而“$*”扩展为单参数“$1c$2c…”(其中c是IFS的第一个字符)。你几乎总是想要“$@”。@Josh单个的
[
实际上是一个命令,如果你键入
哪个[
,你可能会得到一个类似
/usr/bin/[
的路径。这就是为什么你在
[
后面需要一个空格。
[
语法是
的一个改进[
因为它允许您在其中使用逻辑运算符,例如
&&
|
=
。键入
帮助[
以查看更多信息。我会详细了解这一点,-z标志的作用是什么?并且$1必须在“”中吗?我有另一个设置为py(){python$1}而且它似乎没有抱怨。@Josh键入
帮助测试
以查看标志列表。
-z
检查所讨论的参数是否为
NULL
-z是“检查参数的长度是否为0”。在这种特殊情况下,省略“”可能不会有什么坏处,但这不是您应该养成的习惯,因为引号保持文件名和空格的完整性(将参数视为文本替换,而不是像编程语言那样传递形式参数)
if [ $# -ge 1 ]; then
  emacs "$@"