0

在Bash中,以下示例演示了編程語言中的哪些概念?Bash中的這些示例是否演示動態類型和靜態類型?

  1. 在第一個例子中,變量是bar第一字符串類型與 值hello,然後,當它在一個算術表達式被使用,其 值變爲0。所以在我看來,bar 的類型從字符串更改爲整數。

    這是否示例 (因爲bar種類沒有明確地聲明或定義, 和變化根據從字符串的上下文爲整數)表明兩個隱式類型轉換動態類型的 概念?

    $ bar=hello 
    $ echo $bar 
    hello 
    $ echo $((bar)) 
    0 
    
  2. 在第二個例子中,可變bbb被聲明爲整數 類型,我給它一個值3*824。然後我給它 hello,它的值更改爲0

    hello一個字符串 值或其他變量?如果hello是一個字符串值,那麼在將其分配給變量bbb之前,必須將字符串值hello轉換爲整數值0

    請問這個例子說明這個概念靜打字的 ,因爲bbb類型是明確從一開始就宣稱 ,不能改變?

    $ declare -i bbb 
    $ bbb=3*8 
    $ echo bbb 
    24 
    $ bbb=hello 
    $ echo $bbb 
    0 
    

回答

1

關於#1,這不是類型轉換;這是一個參數擴展。

  1. x=6; echo $((x))產生6.該值是一個有效的整數字面值。
  2. x=foo; foo=6; echo $((x))也產生6. x的值是一個字符串,它用一個整數值命名一個參數。
  3. unset x; echo $((x))產生0,因爲x未設置。
  4. x=3+5; y=bar; z=; echo $((x + y + z))產生0,因爲這三個字符串中沒有一個可以通過前面三個規則中的任何一個擴展爲非零整數值。

關於#2,bbb具有其整數屬性集的事實意味着分配給它的任何值都被隱式地視爲算術表達式。即,bbb=whatever相當於bbb=$((whatever))。因此,hello受上述同樣的擴展。具體而言,

$ declare -i bbb 
$ bbb=hello 
$ echo $bbb 
0 
$ hello=6 
$ bbb=hello 
$ echo $bbb 
6 
+0

謝謝。 4.'x = 3 + 5; Y =巴; Z =; echo $((x + y + z))'產生'8'。你爲什麼說'0'? 2.'x = foo;富= 6; echo $((x))',爲什麼最後一個命令跟蹤變量'x'到它的值'foo',然後從變量'foo'到它的值'6',而不是停留在'foo'值的'x'? – Tim

+0

我從示例中刪除了'x = 3 + 5';我想我在一次測試中看到擴展到0,但是我在某個地方犯了一個錯誤。關於'x' /'foo'的例子,擴展是遞歸的;每次擴展在算術上下文中產生一個字符串時,*該字符串也被展開,並且該過程重複直到可以導出整數值。 – chepner