2013-03-07 47 views
1

我正在写从一个非常具体的输入转换单元的bash脚本。单位转换与巴什

我开始做简单的读取和echo语句,并能得到它的读取声明整数和数字得出一个非常特殊的输入,但我无法得到它的if语句工作。

这是到目前为止,我简单的代码:

#!/bin/bash 

declare -i n 
in=inches 
ft=feet 

read number in "as" feet 
if [ ]; then 
    echo "$n $in = $[n/12] $ft" 
fi 

我想现在要做的是创建if/else语句根据一些依赖于用户输入条件句流动。因此,我希望用户输入“24英寸为英尺”或“50英寸为英寸”之类的字符并执行相应的输出。现在,我真的不知道如何在if语句中输入“没有找到命令”这样的错误。

任何帮助,将不胜感激。谢谢。

+0

只是一个提示,让你开始,使用模式匹配:'[[ “$输入” == *英寸x为*英尺*] '如果不引用它,[[...]]会将右侧视为模式(如文件模式)。第一个*会跳过数字,而额外的*字符将允许小的变化,如额外的空格。 (你可能也想查阅一些对于多个匹配更加紧凑的case语句。) – William 2013-03-07 19:01:21

+1

你在Bash中尝试这个事实让我感到畏缩。 Bash中的字符串操作和解析功能有很多不足之处。我建议切换到不同的语言。我会亲自选择Perl。 – 2013-03-07 19:43:52

+2

请注意,'bash'与整数一起工作......您的系统上可能还有一个'units'程序来完成这项工作。 – 2013-03-07 19:56:56

回答

2

首先,不要在你的read命令中使用的变量报价。

read number in as feet 

另一个改进是重命名变量以表示它们存储的内容。我将用下划线代替as,这是一个有效但“不可读”的名称,强调它只是一个占位符,我们并不真正在意它的价值。

read value src_unit _ dest_unit 
# If the user enters "24 inches as feet", we have: 
# value=24 
# src_unit=inches 
# _=as 
# dest_unit=feet 

现在,您的if语句需要检查两件事:值的单位是什么,以及我们想要将其转换为什么单位。这里有一个模板:

if [ "$src_unit" = X ] && [ "$dest_unit" = Y ]; then 
    # Convert X into Y 
fi 

你将与你是从,并转换单元取代XY,并且 中间的代码会是这样的new_value=$(($value/12)),如果从英寸转换为英尺 。请注意0​​不能处理浮点算术, 这是另一个问题的主题。

一个case声明,由cwgem的建议:

case "$src_unit-$dest_unit" in 
    inches-feet) 
     new_value=$(($value/12)) 
     ;; 
    gallons-quarts) 
     new_value=$(($value * 4)) 
     ;; 
    *) echo "I don't know how to convert $src_unit to $dest_unit" 
     ;; 
esac 
+1

我在想一个case语句会更好地工作,在那里你只需CONCAT'src_unit'和'dest_unit'在一起。有一些像'案“$ {src_unit} - $ {} dest_unit在 “英寸英尺”)这边的事情;;同意esac' – cwgem 2013-03-07 20:08:43

+0

我预想的嵌套'if'语句('如果[SRC =英寸;然后#更if语句转换为英尺,厘米等;。fi'),但'case'声明将是一个更简单的方式开始 – chepner 2013-03-07 20:26:10

+0

优秀谢谢你们的case语句是要走的路我最好代表如果我可以的话,你都会。 – user2145599 2013-03-08 17:28:50