在busybox(ash)裡不一樣的awk結果 [論壇 - Ubuntu 程式設計]


正在瀏覽:   1 名遊客


 到底部   前一個主題   下一個主題  [無發表權] 請登錄或者註冊

(1) 2 »


在busybox(ash)裡不一樣的awk結果
會員一級
註冊日期:
2010/6/21 16:38
所屬群組:
已註冊使用者
等級: 2
HP : 0 / 25
MP : 3 / 691
EXP: 0
離線
有一個file內容如下:
# cat table
0x30 6 12
0x31 7 12

一個script如下:
# cat test.sh
entry=0

while read line
do
read var1_$entry var2_$entry var3_$entry << HERE
$(echo $line|awk '{print $1,$2,$3}')
HERE
echo -e "Test1\t$((var1_$entry)) $((var2_$entry)) $((var3_$entry))"

result=$(echo $line|awk '{print $1,$2,$3}')
echo -e "Test2\t$result"

entry=$(expr $entry + 1)
done < table

執行結果:
# ./test.sh
Test1: 48 6 12
Test2: 0x30 6 12
Test1: 49 7 12
Test2: 0x31 7 12

同樣的awk搜尋方式,為何出來的結果不一樣?
Test1會自動轉成十進位,但Test2仍然保持原本的
是因為 read 的關係嗎?
在沒有support bc的前提下,要如何做才能讓 Test1 的結果跟table內容一樣?

2015/5/21 10:41
應用擴展 工具箱
回覆: 在busybox(ash)裡不一樣的awk結果
會員五級
註冊日期:
2012/4/22 10:50
所屬群組:
已註冊使用者
等級: 35
HP : 171 / 855
MP : 588 / 19072
EXP: 21
離線
DJW 寫到:
有一個file內容如下:
# cat table
0x30 6 12
0x31 7 12

一個script如下:
# cat test.sh
entry=0

while read line
do
read var1_$entry var2_$entry var3_$entry << HERE
$(echo $line|awk '{print $1,$2,$3}')
HERE
echo -e "Test1\t$((var1_$entry)) $((var2_$entry)) $((var3_$entry))"

result=$(echo $line|awk '{print $1,$2,$3}')
echo -e "Test2\t$result"

entry=$(expr $entry + 1)
done < table

執行結果:
# ./test.sh
Test1: 48 6 12
Test2: 0x30 6 12
Test1: 49 7 12
Test2: 0x31 7 12

同樣的awk搜尋方式,為何出來的結果不一樣?
Test1會自動轉成十進位,但Test2仍然保持原本的
是因為 read 的關係嗎?
在沒有support bc的前提下,要如何做才能讓 Test1 的結果跟table內容一樣?



試試看下面的程式,看看行不行得通


#!/bin/sh
# test.sh
while read line
do
echo "$line" | awk '{printf("%d %d %d\n", strtonum($1), $2, $3)}'
done < $1



或是簡化版本


#!/bin/sh
# test.sh
while read line
do
echo "$line" | awk '{print strtonum($1), $2, $3}'
done < $1




更改權限


$ chmod u+x ./test.sh



執行


$ ./test.sh table



會顯示下面的結果


48 6 12
49 7 12



剛剛去翻之前的「討論」,還有查詢「awk 16进制转10进制」,查到「一篇」,就湊出上面的程式碼了。



另外你使用的busybox的版本是?


## 更多參考

$ man awk

可以看到一段


String Functions
Gawk has the following built-in string functions:

...略...

strtonum(str) Examine str, and return its numeric value. If str begins with a leading 0, strtonum() assumes that str is an octal
number. If str begins with a leading 0x or 0X, strtonum() assumes that str is a hexadecimal number. Otherwise,
decimal is assumed.

...略...


2015/5/21 13:46
應用擴展 工具箱
回覆: 在busybox(ash)裡不一樣的awk結果
會員一級
註冊日期:
2010/6/21 16:38
所屬群組:
已註冊使用者
等級: 2
HP : 0 / 25
MP : 3 / 691
EXP: 0
離線
結果仍是不如預期, busybox版本是v1.13.2

Test2的做法跟Test1的awk方法是一模一樣的
兩個差別只在Test1會將結果透過read的方式寫進變數,然後才印出來
所以目前是認為問題點不在awk

從Test2的結果可以知道這個指令 echo $line|awk '{print $1,$2,$3}' 的執行結果是會跟檔案的內容一樣
Test1也是用同一個指令,然後再將結果透過read把這個結果寫進變數
不過把變數印出時,卻不一樣了

2015/5/21 14:45
應用擴展 工具箱
回覆: 在busybox(ash)裡不一樣的awk結果
會員五級
註冊日期:
2012/4/22 10:50
所屬群組:
已註冊使用者
等級: 35
HP : 171 / 855
MP : 588 / 19072
EXP: 21
離線
DJW 寫到:
結果仍是不如預期, busybox版本是v1.13.2

Test2的做法跟Test1的awk方法是一模一樣的
兩個差別只在Test1會將結果透過read的方式寫進變數,然後才印出來
所以目前是認為問題點不在awk

從Test2的結果可以知道這個指令 echo $line|awk '{print $1,$2,$3}' 的執行結果是會跟檔案的內容一樣
Test1也是用同一個指令,然後再將結果透過read把這個結果寫進變數
不過把變數印出時,卻不一樣了


我用bash執行你貼出來的程式碼

顯示的結果如下


Test1 48 6 12
Test2 0x30 6 12
Test1 49 7 12
Test2 0x31 7 12




關於



echo $line|awk '{print $1,$2,$3}'



awk本來就是把欄位拆開(空白分隔),然後如實的印出來,並沒有自動去幫你做轉換。

awk會做轉換,要用printf("%d", $1),或是內建的function,例如 strtonum,來作轉換 。

改寫你的程式碼


entry=0

while read line
do
new_line=$(echo $line|awk '{print $1,$2,$3}')

echo $new_line

entry=$(expr $entry + 1)
done < table



用bash執行後,顯示


0x30 6 12
0x31 7 12




另外,我還沒研究read會做什麼動作,是否會將字串轉成數值。(看起來不是這個問題,請看下面回覆)

也還沒用「busybox版本是v1.13.2」,來測試我剛回覆你的程式碼,
因為還沒去建立「busybox版本是v1.13.2」的環境,
可以請教一下你怎麼建立那個環境的嗎?這個我就不會了 Orz...

所以再次跟你確認一下,你有用「busybox版本是v1.13.2」來測試我剛剛貼的程式碼了嗎?

2015/5/21 15:23
應用擴展 工具箱
回覆: 在busybox(ash)裡不一樣的awk結果
會員五級
註冊日期:
2012/4/22 10:50
所屬群組:
已註冊使用者
等級: 35
HP : 171 / 855
MP : 588 / 19072
EXP: 21
離線
再改寫你的程式碼


entry=0

while read line
do
read var1_$entry var2_$entry var3_$entry << HERE
$line
HERE

echo -e "Test1\t$((var1_$entry)) $((var2_$entry)) $((var3_$entry))"

result=$(echo $line|awk '{print $1,$2,$3}')
echo -e "Test2\t$result"

entry=$(expr $entry + 1)
done < table



一樣用bash執行,顯示


Test1 48 6 12
Test2 0x30 6 12
Test1 49 7 12
Test2 0x31 7 12




注意,下面這一段,我用原來的「line」,並沒有使用「awk」產生新的內容。


read var1_$entry var2_$entry var3_$entry << HERE
$line
HERE



所以應該要研究read和here-document會做什麼動作(我還在看manual)。(看起來不是這個問題,請看下面回覆)


另外確認一下,你的需求

你要的是用「read」的方式,然後要顯示跟原來的table一樣嗎?

DJW 寫到:
在沒有support bc的前提下,要如何做才能讓 Test1 的結果跟table內容一樣?



因為我本來以為你的需求,你是要將第一個欄位,從16進位轉成10進位。

所以我才給你一開始回覆你的「那段程式碼」。

我仔細想了一下,若是要一樣,不做轉換,應該就不需要做任何動作,直接cat出來就好。

所以,猜測你的想法,

你是要透過read來獲取每個欄位,存到三個變數去,然後做處理。
然後第一個變數,應該是被自動轉換了,所以就無法如你預期的了。

若是如此的話,應該可以使用awk來做吧?


while read line
do

col_1=$(echo $line | awk '{print $1}')
col_2=$(echo $line | awk '{print $2}')
col_3=$(echo $line | awk '{print $3}')
echo "$col_1" "$col_2" "$col_3"

done < table



或是像我一開始貼的,直接在awk裡面做好你要的輸出。


while read line
do

result=$(echo $line | awk '{print substr($1, 3), $2, $3}')
echo "$result"

done < table




以上釐清


2015/5/21 16:14
應用擴展 工具箱
回覆: 在busybox(ash)裡不一樣的awk結果
會員五級
註冊日期:
2012/4/22 10:50
所屬群組:
已註冊使用者
等級: 35
HP : 171 / 855
MP : 588 / 19072
EXP: 21
離線
## 測試檔案,檔名「table」

內容如下

0x30 6 12
0x31 7 12



====================================================================

剛又仔細看了一下你的程式碼,和做了一些「read」和「here-document」的測試,
突然想到一件事情,大概猜的出來癥結點在哪了
癥結點跟「awk」,「read」,「here-document」都無關,而是跟「expansion」有關

所以只要改成下面的程式碼就會正常了


while read line
do
read col_1 col_2 col_3 << HERE
$line
HERE

echo -e "Test1\t $col_1 $col_2 $col_3"

done < table



顯示


Test1 0x30 6 12
Test1 0x31 7 12



上面的程式也可以簡化成


while read col_1 col_2 col_3
do

echo -e "Test1\t $col_1 $col_2 $col_3"

done < table




====================================================================

你原來程式的邏輯,應該是「Arithmetic Expansion」,
而不是你原來預期的「indirect expansion」或是「variable indirection」。


test="0x31"
echo $test
test2=$(($test))
echo $test2



顯示


0x31
49




或是執行


entry=0
read test_$entry << HERE
0x31
HERE

echo test_$entry

echo "$((test_$entry))"



顯示


test_0
49




參考資料

執行

$ man bash

查詢「Arithmetic Expansion」,可以看到下面這一段



Arithmetic Expansion
Arithmetic expansion allows the evaluation of an arithmetic expression and the substitution of the result. The format for arithmetic expan‐
sion is:

$((expression))

The old format $[expression] is deprecated and will be removed in upcoming versions of bash.

The expression is treated as if it were within double quotes, but a double quote inside the parentheses is not treated specially. All
tokens in the expression undergo parameter and variable expansion, command substitution, and quote removal. The result is treated as the
arithmetic expression to be evaluated. Arithmetic expansions may be nested.

The evaluation is performed according to the rules listed below under ARITHMETIC EVALUATION. If expression is invalid, bash prints a mes‐
sage indicating failure and no substitution occurs.




或是執行

$ man sh

查詢「Arithmetic Expansion」,可以看到下面這一段



Arithmetic Expansion
Arithmetic expansion provides a mechanism for evaluating an arithmetic
expression and substituting its value. The format for arithmetic
expansion is as follows:

$((expression))

The expression is treated as if it were in double-quotes, except that a
double-quote inside the expression is not treated specially. The shell
expands all tokens in the expression for parameter expansion, command
substitution, and quote removal.

Next, the shell treats this as an arithmetic expression and substitutes
the value of the expression.




====================================================================

## 小結

原本你想要的,應該是類似「php Variable variables」,
後來查到的資料,術語應該是「Indirect Expansion」或是「Variable Indirection」或是「Indirect References」。

不過你的需求,我認為應該可以用這篇回覆,最上面的作法去做,就行了。
而且「dash」,「ash」,「bash」,「zsh」都能執行。

查詢了一下「variable variable bash」,查到「一篇」,了解到bash的語法是「${!variable}」。

若是「bash」的話

簡單範例如下


foo="hi hi hi"
bar="foo"
echo ${!bar}



或是


foo_bar="hi hi hi"
entry="bar"
col=foo_$entry
val=${!col}
echo $val



會顯示


hi hi hi




換成你的例子



entry=0
read test_$entry << HERE
0x31
HERE

#echo test_$entry

#echo "$((test_$entry))"

var_entry=test_$entry
echo ${!var_entry}



就會顯示


0x31




所以你原來的程式碼



entry=0

while read line
do
read var1_$entry var2_$entry var3_$entry << HERE
$(echo $line|awk '{print $1,$2,$3}')
HERE
echo -e "Test1\t$((var1_$entry)) $((var2_$entry)) $((var3_$entry))"

result=$(echo $line|awk '{print $1,$2,$3}')
echo -e "Test2\t$result"

entry=$(expr $entry + 1)
done < table




就可以改成



entry=0

while read line
do

read var1_$entry var2_$entry var3_$entry << HERE
$line
HERE

col_1=var1_$entry
col_2=var2_$entry
col_3=var3_$entry

echo -e "Test1\t${!col_1} ${!col_2} ${!col_3}"

entry=$(expr $entry + 1)

done < table



或是簡化成



entry=0

while read var1_$entry var2_$entry var3_$entry
do

col_1=var1_$entry
col_2=var2_$entry
col_3=var3_$entry

echo -e "Test1\t${!col_1} ${!col_2} ${!col_3}"

entry=$(expr $entry + 1)

done < table




上面這個方式也只能在bash執行。

參考資料

$ man bash


查詢「indirect expansion」或是「Parameter Expansion」

就可以看到一段



...略...

Parameter Expansion
The `$' character introduces parameter expansion, command substitution, or arithmetic expansion. The parameter name or symbol to be
expanded may be enclosed in braces, which are optional but serve to protect the variable to be expanded from characters immediately follow‐
ing it which could be interpreted as part of the name.

When braces are used, the matching ending brace is the first `}' not escaped by a backslash or within a quoted string, and not within an
embedded arithmetic expansion, command substitution, or parameter expansion.

${parameter}
The value of parameter is substituted. The braces are required when parameter is a positional parameter with more than one digit, or
when parameter is followed by a character which is not to be interpreted as part of its name. The parameter is a shell parameter as
described above PARAMETERS) or an array reference (Arrays).

If the first character of parameter is an exclamation point (!), it introduces a level of variable indirection. Bash uses the value of the
variable formed from the rest of parameter as the name of the variable; this variable is then expanded and that value is used in the rest of
the substitution, rather than the value of parameter itself. This is known as indirect expansion. The exceptions to this are the expan‐
sions of ${!prefix*} and ${!name[@]} described below. The exclamation point must immediately follow the left brace in order to introduce
indirection.


...略...




====================================================================

另外查詢「sh variable indirection」,可以看到「這篇」,「這篇」,「這篇」,「這篇

原理如下

執行


echo \$



顯示


$



執行


bar=foo
echo $bar



顯示


foo



執行


bar=foo
echo \$$bar



顯示


$foo



執行


foo="hi hi hi"
eval echo $foo



顯示


hi hi hi



執行


foo="hi hi hi"
bar="foo"
eval echo \$$bar



顯示


hi hi hi





綜合以上

簡單範例如下


foo="hi hi hi"
bar="foo"
val=$(eval echo \$$bar)
echo $val



或是


entry="bar"
foo_bar="hi hi hi"
val=$(eval echo \$foo_$entry)
echo $val



或是


foo="hi hi hi"
bar="foo"
eval val=\$$bar
echo $val



或是


entry="bar"
foo_bar="hi hi hi"
eval val=\$foo_$entry
echo $val



會顯示


hi hi hi




所以你的程式碼,可以改成下面的寫法,只要符合POSIX-features的shell都可以執行,
你可以用「bash」,「dash」,「ash」,「zsh」來測。



entry=0

while read line
do

read var1_$entry var2_$entry var3_$entry << HERE
$line
HERE

col_1=var1_$entry
col_2=var2_$entry
col_3=var3_$entry

val_1=$(eval echo \$$col_1)
val_2=$(eval echo \$$col_2)
val_3=$(eval echo \$$col_3)

echo -e "Test1\t$val_1 $val_2 $val_3"

entry=$(expr $entry + 1)

done < table



或是


entry=0

while read line
do

read var1_$entry var2_$entry var3_$entry << HERE
$line
HERE

val_1=$(eval echo \$var1_$entry)
val_2=$(eval echo \$var2_$entry)
val_3=$(eval echo \$var3_$entry)

echo -e "Test1\t$val_1 $val_2 $val_3"

entry=$(expr $entry + 1)

done < table



或是


entry=0

while read line
do

read var1_$entry var2_$entry var3_$entry << HERE
$line
HERE

eval val_1=\$var1_$entry
eval val_2=\$var2_$entry
eval val_3=\$var3_$entry

echo -e "Test1\t$val_1 $val_2 $val_3"

entry=$(expr $entry + 1)

done < table




或是


entry=0

while read line
do

read var1_$entry var2_$entry var3_$entry << HERE
$line
HERE

echo -n -e "Test1\t"
eval echo "\$var1_$entry \$var2_$entry \$var3_$entry"


entry=$(expr $entry + 1)

done < table






同樣的,上面也可以簡化成下面的寫法



entry=0

while read var1_$entry var2_$entry var3_$entry
do

col_1=var1_$entry
col_2=var2_$entry
col_3=var3_$entry

val_1=$(eval echo \$$col_1)
val_2=$(eval echo \$$col_2)
val_3=$(eval echo \$$col_3)

echo -e "Test1\t$val_1 $val_2 $val_3"

entry=$(expr $entry + 1)

done < table



或是



entry=0

while read var1_$entry var2_$entry var3_$entry
do

val_1=$(eval echo \$var1_$entry)
val_2=$(eval echo \$var2_$entry)
val_3=$(eval echo \$var3_$entry)

echo -e "Test1\t$val_1 $val_2 $val_3"

entry=$(expr $entry + 1)

done < table



或是


entry=0

while read var1_$entry var2_$entry var3_$entry
do

eval val_1=\$var1_$entry
eval val_2=\$var2_$entry
eval val_3=\$var3_$entry

echo -e "Test1\t$val_1 $val_2 $val_3"

entry=$(expr $entry + 1)

done < table



或是


entry=0

while read var1_$entry var2_$entry var3_$entry
do

echo -n -e "Test1\t"
eval echo "\$var1_$entry \$var2_$entry \$var3_$entry"


entry=$(expr $entry + 1)

done < table




====================================================================

若是bash,也可以用下面陣列的寫法



while read line
do
read col[0] col[1] col[2] << HERE
$line
HERE

echo -e "Test1\t${col[0]} ${col[1]} ${col[2]}"

done < table




上面的程式可以簡化成下面的寫法


while read col[0] col[1] col[2]
do

echo -e "Test1\t${col[0]} ${col[1]} ${col[2]}"

done < table



參考資料

$ man bash

查詢「Arrays」

就可以看到一段



...略...

Arrays
Bash provides one-dimensional indexed and associative array variables.

...略...



====================================================================

## 更多參考資料


$ man bash

查詢「here-document」

--------------------------------------------------

$ man sh

查詢「here-document」

--------------------------------------------------

$ man bash

查詢「SHELL BUILTIN COMMANDS」
往下找

會看到

read [-ers] [-a aname] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...]

...略...




執行

$ type read

就會看到


read is a shell builtin



所以執行下面的指令,就會看到「read」的說明文件

$ help read

--------------------------------------------------

$ man bash

查詢「Command Substitution」


$ man sh

查詢「Command Substitution」
--------------------------------------------------


2015/5/21 17:37
應用擴展 工具箱
回覆: 在busybox(ash)裡不一樣的awk結果
會員一級
註冊日期:
2010/6/21 16:38
所屬群組:
已註冊使用者
等級: 2
HP : 0 / 25
MP : 3 / 691
EXP: 0
離線
感謝你的幫忙,原來想的方向錯了
另外再請教一個問題,search string的指令哪邊有問題呢?
# cat test.sh
entry=0
table1=$1
table2=$2

echo "Test: Get all numbers and corresponding string depend on the first number"
while read line
do
read var1_$entry var2_$entry var3_$entry << HERE
$line
HERE
string_$entry=$(cat $table2|grep $(eval echo \$var1_$entry)|sed 's/ (.*)//g')
eval echo -e "\\\t\$var1_$entry \$var2_$entry \$var3_$entry \$string_$entry"
entry=$(expr $entry + 1)
done < $table1

# cat number string
0x30 6 12
0x31 7 12
First String (0x30)
Second String (0x31)

# ./test.sh number string
Test: Get all numbers and corresponding string depend on the first number
./test.sh: line 14: string_0=First: not found
0x30 6 12
./test.sh: line 1: string_1=Second: not found
0x31 7 12

2015/5/22 11:08
應用擴展 工具箱
回覆: 在busybox(ash)裡不一樣的awk結果
會員五級
註冊日期:
2012/4/22 10:50
所屬群組:
已註冊使用者
等級: 35
HP : 171 / 855
MP : 588 / 19072
EXP: 21
離線
DJW 寫到:
感謝你的幫忙,原來想的方向錯了
另外再請教一個問題,search string的指令哪邊有問題呢?
# cat test.sh
entry=0
table1=$1
table2=$2

echo "Test: Get all numbers and corresponding string depend on the first number"
while read line
do
read var1_$entry var2_$entry var3_$entry << HERE
$line
HERE
string_$entry=$(cat $table2|grep $(eval echo \$var1_$entry)|sed 's/ (.*)//g')
eval echo -e "\\\t\$var1_$entry \$var2_$entry \$var3_$entry \$string_$entry"
entry=$(expr $entry + 1)
done < $table1

# cat number string
0x30 6 12
0x31 7 12
First String (0x30)
Second String (0x31)

# ./test.sh number string
Test: Get all numbers and corresponding string depend on the first number
./test.sh: line 14: string_0=First: not found
0x30 6 12
./test.sh: line 1: string_1=Second: not found
0x31 7 12


哇,你在考我的頭腦阿,我的頭腦太老舊了,無法處理這麼複雜的運算。

我上面只是告訴你,有「variable indirection」這樣的用法。

除非必要,否則基本上不建議去用它拉,

因為程式碼會一層包一層,就會顯得不好閱讀,又不好除錯。
又不是在玩指標的指標,還是template,呵呵。
應該不用這麼自虐,這樣折騰自己吧...

好拉,開玩笑的,我一時,也看不出來你上面哪邊出了錯,
可能需要花點時間慢慢拆解。這個我就暫時不花時間在上面了。
我頭殼裡面的CPU真的太老舊了。

我先寫了下面簡單版的,也是我上面回覆,一開始建議你的寫法。

不過我不確定你的需求是不是要這樣做,你在根據你自己的需求修改吧。

## 檔案「string」


First String (0x30)
Second String (0x31)



## 檔案「number」


0x30 6 12
0x31 7 12



## 檔案 「test.sh」



entry=0
table1=$1
table2=$2

echo "Test: Get all numbers and corresponding string depend on the first number"

while read col_1 col_2 col_3
do

str=$(cat $table2 | grep $col_1 | sed 's/ (.*)//g')
echo -e "\t$col_1 $col_2 $co1_3 $str"

done < $table1




執行


./test.sh number string



顯示

Test: Get all numbers and corresponding string depend on the first number
0x30 6 12 First String
0x31 7 12 Second String


2015/5/22 13:42
應用擴展 工具箱
回覆: 在busybox(ash)裡不一樣的awk結果
會員一級
註冊日期:
2010/6/21 16:38
所屬群組:
已註冊使用者
等級: 2
HP : 0 / 25
MP : 3 / 691
EXP: 0
離線
好,我會從這方向去思考的
會這樣用的原因主要是因為table的內容實際上有幾十行,每一行有10幾個數值需存進變數
所有的變數在while loop結束後都還要拿出來做特定的處理
所以事實上我會需要幾百個變數來存table裡的值
為了不讓程式變的太冗長,所以才沒有照你的建議去使用變數

還是很謝謝你的幫忙

2015/5/22 15:17
應用擴展 工具箱
回覆: 在busybox(ash)裡不一樣的awk結果
會員五級
註冊日期:
2012/4/22 10:50
所屬群組:
已註冊使用者
等級: 35
HP : 171 / 855
MP : 588 / 19072
EXP: 21
離線
DJW 寫到:
好,我會從這方向去思考的
會這樣用的原因主要是因為table的內容實際上有幾十行,每一行有10幾個數值需存進變數
所有的變數在while loop結束後都還要拿出來做特定的處理
所以事實上我會需要幾百個變數來存table裡的值
為了不讓程式變的太冗長,所以才沒有照你的建議去使用變數

還是很謝謝你的幫忙


我大概猜的出來,為啥你堅持要這樣做。

像這樣複雜的資料結構,我就會用PHP處理了。

不過你這個script要執行,環境應該是在busybox。

所以應該也無法使用PHP。

另外先給你一個方向,下面的方式,不會是你預期的



entry=0
string_$entry="First"



就會顯示


test.sh: line 2: string_0=First: command not found



這跟你剛剛的程式錯誤的地方是一樣的

剛測試了一下


entry=0
eval string_$entry="First"
eval echo \$string_$entry



就會顯示


First




還在研究怎麼改寫你的程式




另外突然想到,你的環境,可以用awk來處理吧,用awk也許可以做到你的需求。
不過不是很了解你的需求,所以提出來當參考摟。

2015/5/22 15:57
應用擴展 工具箱

(1) 2 »

 [無發表權] 請登錄或者註冊


可以查看帖子.
不可發帖.
不可回覆.
不可編輯自己的帖子.
不可刪除自己的帖子.
不可發起投票調查.
不可在投票調查中投票.
不可上傳附件.
不可不經審核直接發帖.