使用while循环接受默认值

时间:2013-10-31 11:34:47

标签: bash while-loop

我试图让这段代码接受用户给定的4值或" /"接受默认值。

#!/bin/bash
$komp=1
while [ ${#nbh[@]} -ne `expr 4 \* $komp` || ${nbh[0]} -ne "/" ]
do
  echo "Enter 4 element or / to accept default"
  read -a nbh
  if [ ${#nbh[@]} -ne `expr 4 \* $komp` || ${nbh[0]} -ne "/"  ]
  then 
    echo "Wrong!!"
  else
    if [ nbh -eq "/" ]
    then
      declare -a nbh=('1' '0' '1' '1')
    fi
  fi
done

目前的情况是错误:

./mini.sh: line 3: [: missing `]'
./mini.sh: line 3: -ne: command not found

请帮助。

2 个答案:

答案 0 :(得分:3)

根本问题是你不能用这种方式做一个布尔表达式。

while [ expr1 || expr2 ]  # WRONG

不起作用,因为shell将其解析为两个命令:[ expr(命令[带有一个参数“expr1”)和expr2 ](命令expr2 with一个论点“]”)。这是一个错误,因为[命令要求其最后一个参数是文字字符串]。如果使用test命令而不是[,则更容易理解语法,但以下任何一种都可以使用:

while test expr1 || test expr2
while [ expr1 ] || [ expr2 ]
while [ expr1 -o expr2 ]
while test expr1 -o expr2

答案 1 :(得分:2)

#!/bin/bash

komp=1
default=(1 0 1 1)
prompt="Enter 4 elements or / to accept default: "

valid_input=0
while ((!valid_input)) && read -a nbh -p "$prompt"; do
    if ((${#nbh[@]}==1)) && [[ ${nbh[0]} = / ]]; then
        for ((i=0,nbh=();i<komp;++i)); do nbh+=( "${default[@]}" ); done
    fi
    if ((${#nbh[@]} != 4*komp)); then
        echo "Wrong!!"
        continue
    fi
    valid_input=1
done

if ((!valid_input)); then
    echo >&2 "There was an error reading your input. Do you have a banana jammed in your keyboard?"
    exit 1
fi

# Here, all is good

现在,您还要检查用户的输入是否为有效数字。

请阅读(并了解)the answer I provided to your other question。 (如果你真的这样做了,你就不会问这个问题。)