我必须找到一种方法让我的脚本从以下三个选项之一中读取:
以下是我目前的情况:
#!/bin/bash
key=$1
[ $# -ge 1 -a -f "$2" ] && input="$2" || [ -f "$INPUT" ] && input="$INPUT" || input="-"
echo $input
只有环境变量拒绝工作,其余的工作正常。
我之前尝试过使用export INPUT="pathnametofile"
但它没有任何区别,我最终得到了shell,要求我输入信息,好像我打电话给cat
。
答案 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="-"
现在你可能会明白为什么会出现意想不到的行为。
{ [ $# -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