是否有可能在bash中没有'$'的情况下访问环境变量?

时间:2014-04-04 21:52:05

标签: linux bash environment-variables alias

这看似微不足道,但我是bash脚本的新手,我在其他地方找不到答案。

我在ubuntu 13.04上安装了mplayer,我正在使用它来流式传输互联网广播电台。通常你需要提供ip作为参数:

mplayer http://176.31.113.37:8080

我在root .bash_aliases中创建了一个别名文件,其中包含以下内容:

export SOMA="http://173.239.76.147:8090"
export FRESH="http://176.31.113.37:8080"

现在我只能使用电台名称播放电台:mplayer $FRESH。 我想知道是否有可能摆脱$符号,例如使用命令mplayer FRESH

谢谢!

5 个答案:

答案 0 :(得分:3)

如果您使用变量,则需要使用$进行扩展。我会用别名做这个,而不是变量。考虑这样的事情:

alias mpsoma='mplayer http://192.168.1.1:8090'

然后只需输入mpsoma即可运行完整命令。

答案 1 :(得分:2)

当然,你可以这样做;你只需要一个内置间接功能。 (如果您不知道,间接正在通过其名称而不是通过其值访问值。在Bash中,这是由参数扩展中的preceding the variable name with a !完成的。)

##
# Expand variables passed as arguments, otherwise just invoke mplayer normally.
#
mplayer() {
    local first=${!1:-"$1"} # Expand to the indirection of $1 if it exists,
                            # otherwise expand to the value of "$1"
    shift # Drop the 1st parameter. With enough focus, I could probably make this
          # do the indirection on every positional parameter, but it's Friday.
    command mplayer "$first" "$@"
}

如果您将echo放在command mplayer部分之前,您可以看到它正在做什么:

$ mplayer my name is dug
command mplayer my name is dug
$ my=your
$ mplayer my name is dug
command mplayer your name is dug
$ my=our mplayer my name is dug # You can even do in-place export assignment
command mplayer our name is dug
$ echo $my
your

答案 2 :(得分:2)

我发现你的想法非常好,所以我想到了如何以另一种方式解决这个问题。我想到的是在~/.bashrc内设置一个函数。该函数可以像任何其他命令一样执行:

# Give the function a nice name - "mplayer" could be problematic
radio()
{
    # Validate the number of parameters passed to our function
    (( $# != 1 )) && {
        printf "%s\n" "Please provide exactly one stream. Quitting."
        return 1
    }

    local stream_alias stream_uri

    # Assign the first parameter to a local variable
    stream_alias="$1"

    # Assign uris to a variable dependent on the value of the
    # parameter passed to the function
    case "$stream_alias" in
        fresh)
            stream_uri="http://176.31.113.37:8080"
        ;;

        soma)
            stream_uri="http://173.239.76.147:8090"
        ;;

        *)
            printf "%s\n" "Unknown stream. Quitting."
            return 1
        ;;
    esac

    mplayer "$stream_uri" && {
        printf "%s\n" "Playing radio station «${stream_alias}@${stream_uri#*\/\/}»."
    }

    return 0
}

这将为您提供以下结果:

$ radio fresh
Playing radio station «fresh@176.31.113.37:8080».

$ radio soma
Playing radio station «soma@173.239.76.147:8090».

$ radio stream1
Unknown stream. Quitting.

虽然还有改进的余地 - 比如将uris和/或电台名称放入(关联)阵列并可能添加其他功能 - 我认为你会有这样的想法作为替代方案,在你不想要的情况下将函数放在.bashrc中可能是因为您希望所有用户都可以使用它,只需使用一个小脚本并将其放在每个用户$PATH中的某个位置(当然您可以添加)它的路径)。我为此目的使用/usr/local/bin

$ cat radio
#!/usr/bin/env bash

# Validate the number of parameters passed to our script
(( $# != 1 )) && {
    printf "%s\n" "Please provide exactly one stream. Quitting."
    exit 1
}

_mplayerStream()
{
    local stream_alias stream_uri

    # Assign the first parameter passed to the function
    # to a local variable
    stream_alias="$1"

    # Assign uris to a variable dependent on the value of the
    # parameter passed to the function
    case "$stream_alias" in
        fresh)
            stream_uri="http://176.31.113.37:8080"
        ;;

        soma)
            stream_uri="http://173.239.76.147:8090"
        ;;

        *)
            printf "%s\n" "Unknown stream. Quitting."
            exit 1
        ;;
    esac

    mplayer "$stream_uri" && {
        printf "%s\n" "Playing radio station «${stream_alias}@${stream_uri#*\/\/}»."
    }

    return 0
}

_mplayerStream "$1"

$ radio soma
Playing radio station «soma@173.239.76.147:8090».

我能想象的一个非常好的功能是选项卡完成,显示脚本中定义的可用流列表。

答案 3 :(得分:1)

您可以创建一个这样的别名:

alias FRESH="mplayer http://176.31.113.37:8080"

然后你可以输入

FRESH

将该行放在登录目录中的.profile文件中,每次登录时都可以使用。

答案 4 :(得分:0)

网站说明:我会在您的情况下使用bash aliases。例如,您可以在.bashrc(或更好的.bash_aliases文件中编写代码(如果存在):

alias fresh='mplayer http://176.31.113.37:8080'

现在,您可以在终端中输入fresh来收听此互联网信息流。