2016-03-05 46 views
2

我在bash腳本中打印類似10x10的東西時遇到了麻煩。這裏是我有:

#!/bin/bash 

i="2" 
array=(1024 2048 4096 6144) 

while [ $i -lt 17 ] 
do 
    for j in "${array[@]}" 
    do 
    : 
    secondpart=$((j/i)) 
    echo "$jx$jx$j and $secondpartx$secondpart" 
done 
    echo "\n" 
    i=$[$i*2] 
done 

預期輸出是: 1024x1024x1024和512×512

+0

順便說一句,當run沒有被很好地定義時,'echo'會產生什麼樣的結果 - 事實上,如果沒有XSI擴展,POSIX標準沒有定義echo的行爲,如果它的輸入包含任何反斜槓的話。如果你只是想發出一個換行符,可以考慮一個簡單的'echo'。 (有關「echo」是否有保證的詳細信息,請參閱http://pubs.opengroup.org/onlinepubs/009604599/utilities/echo.html;如果您查看APPLICATION USAGE部分,您將請注意'printf'通常是模糊情況下的首選/現代替代品)。 –

+0

不標記爲重複,但超密切相關:http://stackoverflow.com/questions/8748831/when-do-we-need-curly-braces-in-variables-using-bash –

+0

@CharlesDuffy:抱歉,錯過了EXEC。我編輯過它。由於它是相同的東西,我在這裏跟進了。 ( – newbiecoder

回答

3

使用${j}x;否則它會尋找一個變量,稱爲$jx

+0

非常好!謝謝:) – newbiecoder

+0

關於相同代碼的後續問題。這些數字基本上是可執行文件的參數。所以基本上:./exec 100x100x100 10x10。你如何分配這個字符串變量,然後執行?我試過cmd =「./exec $ jx $ jx $ j和$ secondpartx $ secondpart」,然後cmd,但是不起作用。 – newbiecoder

+0

我編輯了代碼來適應這個問題,因爲我意識到寫在這裏看起來更加討厭。因此,通過代碼 – newbiecoder

0

使用join類型函數。要容易得多:

$ function join_array { local IFS="$1"; shift; echo "$*"; } 
$ array=(1024 2048 4096 6144) 
$ join_array x "${array[@]}" 
1024x2048x4096x6144 

然後分配給一個字符串:

$ s=$(join_array x "${array[@]}") 
$ echo "$s" 
1024x2048x4096x6144 

,或者更直接地(無功能),你可以這樣做:

$ st=$(IFS=x; echo "${array[*]}") 
$ echo "$st" 
1024x2048x4096x6144 

如果您的主要用途是要分配給一個字符串,請使用第二種方法。