2015-06-03 50 views
0

我有以下线在我的Mac OS .bash_profile文件:什么是||的等价物shell脚本中的JavaScript运算符?

alias server="clear && python -m SimpleHTTPServer \$(portdiscovery)" 

portdiscovery是一个简单的程序,输出一个可用的端口。

我想有一个可选的端口参数设置将覆盖调用portdiscovery,这样的事情(这将无法正常工作)时:

alias server="clear && python -m SimpleHTTPServer $1 || \$(portdiscovery)" 

基本上,我需要的||运营商的行为在JavaScript中,例如:var port = userInput || portdiscovery()

有没有办法在shell脚本中做到这一点?如果不能用单线实现这个功能,我怎么才能用shell函数实现这个功能?

我的函数也似乎不正常工作

function server { 
    clear; 

    if [ "$1" == "" ] 
    then 
     python -m SimpleHTTPServer $(portdiscovery) 
    else 
     python -m SimpleHTTPServer $1 
    fi 
} 
+0

别名是简单的文本替换,所以'$ 1'的别名并不是指别名的第一个参数,但在从别名被称为背景下'$ 1'。 –

+0

顺便提一句,'function'关键字是反模式的 - 它是与POSIX sh不必要的不​​兼容性。只需使用'server(){...'是定义函数的更好方法。 –

+0

同样,出于兼容性原因,习惯于使用if [“$ 1”=“”]'或者如果[-z“$ 1”]'比'if'“$ 1”==“”]更加安全。] '; '=='在POSIX sh中不是有效的字符串比较运算符。 –

回答

2

怎么是这样的:

server() { 
    clear 
    python -m SimpleHTTPServer "${1-$(portdiscovery)}" 
} 

在bash中,语法${var-default}意味着如果$var未设置,使用default代替。在这种情况下,缺省值是功能portdiscovery的输出。

我已经使用了标准语法而不是bash的function风格的方法。

测试出来:

$ portdiscovery() { echo "port discovery"; } 
$ server() { echo "${1-$(portdiscovery)}"; } 
$ server 
port discovery 
$ server 8802 
8802 
-1

您可以设置别名,然后检查了$ 1,如果它被设置重置

server="clear && python -m SimpleHTTPServer ${1}" 
[[ ! $1 ]] && server=$(portdiscovery) 

编辑:

先设置默认值。

server=$(portdiscovery) 
[[ $1 ]] && server="clear && python -m SimpleHTTPServer ${1}" 
+0

为什么downvote?如果这不起作用,请分享。它与我的测试一起工作。如果这不是很好的做法,我想知道.. – m79lkm

+0

它应该转身 - 设置默认优先,然后检查/重置..那还有什么? – m79lkm

+0

您正在创建一个包含一段脚本的标量变量,但没有关于如何实际执行该内容的说明; '$ server'将无法正常工作,因为它执行字符串拆分和glob扩展,但不是解析的先前阶段,也不会将'server'作为命令运行(因为您定义了一个变量,而不是别名或功能)。此外,由于它包含shell语法,因此它可以正确调用的唯一方法是使用'eval'或等价物,从而引发安全问题。 –

相关问题