Linux shell脚本中的参数

时间:2015-04-08 20:23:08

标签: linux shell

我正在尝试在Linux中创建一个充当基本计算器的脚本文件。它需要传递3个参数或没有参数。

如果它有3个参数,它应该能够像这样执行。

./mycalc 1 + 2
the sum of 1 plus 2 equals 3

但如果它没有任何参数,则应显示一个菜单,要求进行减法,加法或退出。

这种布局看起来如何?我一直在尝试,但无论何时我运行它都会给我错误,说我需要输入参数,然后在错误后显示菜单。

op="$2"

if [ $op == "+" ]
then
   sum=$(expr $1 + $3)
   echo "The sum of $1 plus $3 equals $sum"
elif [ $op == "-" ]
then
   diff=$(expr $1 - $3)
   echo "The sum  of $1 minus $3 equals $diff"
else    

while [ $ch != "X" ] || [ $ch != "x" ] 
do
read -p "C) Calculation
 X) Exit" ch

2 个答案:

答案 0 :(得分:0)

命令行参数引用为$1, $2, $3... (第一个arg为1美元,第二个为2美元......)

您可以使用以下方法测试参数是否为空

if [ -z "$1" ]
  then
    echo "No argument supplied"
fi

答案 1 :(得分:0)

这是一个“可爱”的答案。我稍后会给你一些关于你的代码的反馈。

#!/bin/bash
case $2 in 
  +|-) :;; 
  *) echo "unknown operator: $2"; exit 1;;
esac
declare -A ops=( 
  ["-"]=minus 
  ["+"]=plus 
)
printf "%d %s %d equals %d\n" "$1" "${ops["$2"]}" "$3" "$(bc <<< "$*")"

这是一个重写,希望展示一些有用的技巧和良好实践

#!/bin/bash

user_args () {
    case $2 in
        +) echo "The sum of $1 plus $3 equals $(( $1 + $3 ))" ;;
        -) echo "The sum of $1 minus $3 equals $(( $1 - $3 ))" ;;
        *) echo "I don't know what to do with operator '$2'" ;;
    esac
}

interactive () {
    PS3="Select an operator: "
    select choice in plus minus exit; do
        case $choice in
            plus)  operator="+"; break ;;
            minus) operator="-"; break ;;
            exit)  exit;;
        esac
    done
    read -p "First value: " first
    read -p "Second value: " second
    echo "The sum of $first $choice $second equals $(( $first $operator $second ))"
}

if (( $# == 3 )); then
    user_args "$@"
else
    interactive
fi
  • 使用模块化功能
  • 容易扩展分支的案例陈述
  • 选择语句以生成菜单并强制执行有效输入
  • bash的内置算术表达式
  • 使用"$@"
  • 传递参​​数
  • 引用需要引用的变量