1

我试图让这段代码接受用户给定的 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

请帮忙。

4

2 回答 2

3

根本问题是你不能那样做一个布尔表达式。

while [ expr1 || expr2 ]  # WRONG

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

while test expr1 || test expr2
while [ expr1 ] || [ expr2 ]
while [ expr1 -o expr2 ]
while test expr1 -o expr2
于 2013-10-31T12:01:43.053 回答
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

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

请阅读(并理解)我为您的其他问题提供的答案。(如果你真的这样做了,你就不会问这个问题了)。

于 2013-10-31T11:47:30.023 回答