这看似微不足道,但我是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
。
谢谢!
答案 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
来收听此互联网信息流。