根据Advanced Bash-Scripting Guide,
bash变量是无类型的:
与许多其他编程语言不同,Bash不会将其变量按“类型”隔离。从本质上讲,Bash变量是字符 字符串,但是,根据上下文,Bash允许算术 操作和变量比较。决定因素是 变量的值是否只包含数字。
该链接还提供了示例。
“无类型”是否与“动态打字”的概念相同 在编程语言?如果没有,那么关系是什么 两者之间的差异?
为了减轻在脚本中跟踪变量类型的负担,Bash确实允许declaring个变量。
例如,通过declare -i
myvariable
将变量声明为整数类型。
这被称为“打字”变量吗? “打字”是什么意思 与“静态打字”的概念相同?
答案 0 :(得分:3)
这里的大部分都得到了很好的解答......
Does "untyped" also mean "dynamically typed" in the academic CS world?
至少有两个人非常熟悉此事。对于我们大多数尚未研究类型系统等的人而言,“无类型”意味着动态打字,但这在学术界是个用词不当,见上文。 untyped
实际上意味着没有类型,即思考程序集,键入Bash,它在运行时计算出它的类型。让我们从Advanced Bash Scripting Guide中采用以下句子,强调我的......
http://tldp.org/LDP/abs/html/untyped.html
与许多其他编程语言不同,Bash不会将其隔离 变量按“类型”。从本质上讲,Bash变量是字符 字符串,但是,根据上下文,Bash允许算术运算 并对变量进行比较。 决定因素是否是 变量的值只包含数字。
Bash发现某些东西在运行时是一个数字,即它是动态类型的。
在64位机器上的汇编程序中,我可以将任意8个字节存储在寄存器中并递减它,它不检查事物是否为字符等,没有context
关于它将要减少它的事情递减64位,它不会检查或计算出它正在递减的东西的类型。
Perl不是一种无类型语言,但以下代码可能会使它看起来像是将整数视为整数,即
#!/usr/bin/perl
use strict;
use warnings;
my $foo = "1";
my $bar = $foo + 1;
print("$bar\n");
$ foo被分配了一个字符串但是增加了?这是否意味着Perl是无类型的,因为基于上下文它可以做你想做的事情?我不这么认为。
这与Python不同,如果您尝试相同的事情,Python实际上会给您以下错误...
Traceback (most recent call last):
File "py.py", line 2, in <module>
bar = foo + 1
如果Python是动态类型的,并且Perl是动态类型的,为什么我们会看到不同的行为。是因为他们的类型系统不同或者他们的类型转换语义不同。在汇编中我们有类型转换指令,将字符串更改为整数,反之亦然?
Bash有不同的类型转换规则
#!/bin/bash
set -e
MYVAR=WTF
let "MYVAR+=1"
echo "MYVAR == $MYVAR";
这会将1
分配给MYVAR而不是递增它,即如果你增加一个字符串bash将字符串设置为整数零,然后执行增量。它正在执行类型转换,这意味着它是键入的。
对于仍然认为Bash是无类型的人,试试这个......
#!/bin/bash
declare -i var1=1
var1=2367.1
你应该得到这样的东西......
foo.sh: line 3: 2367.1: syntax error: invalid arithmetic operator (error token is ".1")
但以下显示没有此类错误
#!/bin/bash
var1=2367.1
以下
的输出#!/bin/bash
var1=2367.1
echo "$var1"
let "var1+=1"
echo "$var1"
是相同的警告而没有声明类型......
2367.1
foo.sh: line 4: let: 2367.1: syntax error: invalid arithmetic operator (error token is ".1")
2367.1
更好的例子就是这个
#!/bin/bash
arg1=1234
arg2=abc
if [ $arg1 -eq $arg2 ]; then
echo "wtf";
fi
为什么我会这样......
foo.sh: line 5: [: abc: integer expression expected
Bash正在问我一个整数表达式。
答案 1 :(得分:-1)
Bash是动态类型或更正确的,它是动态检查的语言。我已经添加了一个很长的答案,这是一个很短的答案。
#!/bin/bash
arg1=1234
arg2=abc
if [ $arg1 -eq $arg2 ]; then
echo "wtf";
fi
给出了此错误消息....
foo.sh: line 5: [: abc: integer expression expected
我有一个错误告诉我,我在某种程度上犯了关于类型的错误意味着某些东西是检查类型。