选择n#34;输入"在AND(&&)和OR(||)命令列表中

时间:2014-12-06 15:54:43

标签: bash shell input

我必须找到一种方法让我的脚本从以下三个选项之一中读取:

  • 文件参数
  • 标准输入
  • 以前建立的环境变量

以下是我目前的情况:

#!/bin/bash

key=$1
[ $# -ge 1 -a -f "$2" ] && input="$2" || [ -f "$INPUT" ] && input="$INPUT" || input="-"
echo $input

只有环境变量拒绝工作,其余的工作正常。 我之前尝试过使用export INPUT="pathnametofile"但它没有任何区别,我最终得到了shell,要求我输入信息,好像我打电话给cat

2 个答案:

答案 0 :(得分:1)

脚本中的问题

由于shell处理Lists of Commands

的方式,您的尝试无法正常工作
  

'&&'和'||'具有相同的优先权。

     

AND和OR列表以左关联性执行。

你的句子:

[ $# -ge 1 -a -f "$2" ] && input="$2" || [ -f "$INPUT" ] && input="$INPUT" || input="-"

做同样的事情:

[ $# -ge 1 -a -f "$2" ] && input="$2"
[ $? -eq 0 ] || [ -f "$INPUT" ]
[ $? -eq 0 ] && input="$INPUT"
[ $? -eq 0 ] || input="-"

现在你可能会明白为什么会出现意想不到的行为。


更好的尝试grouping commands

{ [ $# -ge 1 -a -f "$2" ] && input="$2"; } || { [ -f "$INPUT" ] && input="$INPUT"; } || input="-"

现在,由于优先顺序,根本不需要第一组:

[ $# -ge 1 -a -f "$2" ] && input="$2" || { [ -f "$INPUT" ] && input="$INPUT"; } || input="-"

此外,除非您手动设置位置参数,否则您可以删除第一项检查(毕竟,如果$2是emtpy,-f ""失败则相同)。

[ -f "$2" ] && input="$2" || { [ -f "$INPUT" ] && input="$INPUT"; } || input="-"

使用if conditional construct

的替代方案
if [ -f "$2" ]; then
    input=$2
elif [ -f "$INPUT" ]; then
    input=$INPUT
fi
echo "${input:=-}"

答案 1 :(得分:0)

未经测试,但您可能会更好地使用if命令,并测试该变量不为空:

if [ $# -ge 1 -a -f "$2" ]; then
    input="$2"
elif [ -n "$INPUT" -a -f "$INPUT" ]; then
    input="$INPUT"
else
    input="-"
fi