Bash shell-Accesing String数组,索引为变量

时间:2016-07-24 04:36:08

标签: bash unix

我确实得到了关于这个主题的答案,但它还没有工作,所以请帮忙。

一段代码,其中我无法访问索引为变量i的字符串数组。我试图在相应的索引处插入一个值,但它不起作用。

i=0
declare -a str_arr

while read line

do
post=`echo $line| cut -d '|' -f2`
dept=`echo $line| cut -d '|' -f4`

str_arr[$i]="$dept|$post"

i=$(( i+1 ))
done< emp_info.dat

echo ${str_arr[@]}

我用管道运算符将两个变量插入到字符串数组中。

输出就像这样给出

> example.sh: 2: example.sh: declare: not found example.sh: 10:
> example.sh: str_arr[0]=aaaa|developer: not found example.sh: 10:
> example.sh: str_arr[1]=bbbb|tester: not found example.sh: 10:
> example.sh: str_arr[2]=Empower|Senior dev: not found example.sh: 10:

2 个答案:

答案 0 :(得分:3)

在评论中提及@gordon-davisson时,Ubuntu 14.04中的默认shell为//print_r($_GET); $q=$_POST['q']; $query="SELECT * FROM viewlibrary WHERE studentname LIKE :q OR matricno LIKE :q OR title LIKE :q OR programme LIKE :q OR serialno LIKE :q ORDER BY studentname ASC"; $stmt = $db->prepare($query); $stmt->bindValue(':q','%'.$q.'%'); $stmt->execute(); $a = 0; if($stmt->rowCount() > 0){ $r=$stmt->fetchAll(); echo "<table class='tablesorter' id='myTable' style='width:97%; table-border: 1'>"; echo "<thead>"; echo "<tr>"; echo "<th>No.</th>"; echo "<th>No.Matric</th>"; echo "<th>Name</th>"; echo "<th>Programme</th>"; echo "<th>Title</th>"; echo "<th>Serial Number</th>"; echo "<th>Availability</th>"; echo "<th>Edit</th>"; echo "<th>Delete</th>"; echo "</tr>"; echo "</thead>"; echo "<tbody>"; foreach($r as $row){ echo "<tr align='center'><td>". ($a+1) ."</td><td>". $row['matricno'] ."</td><td>". $row['studentname'] ."</td><td>". $row['programme'] ."</td><td>". $row['title'] ."</td><td>". $row['serialno'] ."</td><td>". $row['bavailable'] ."</td><td><a href='editpage.php?idstudent=".$row['matricno']."&idbook=".$row['serialno']."'><img src='pic/edit-icon.png' width=15px></a></td><td><a href='deletepage.php?idstudent=".$row['matricno']."&idbook=".$row['serialno']."'><img src='pic/remove-icon-png-15.png' width=15px></a></td></tr>"; $a++; } echo "</tbody>"; echo "</table>"; } else{ echo "<p align='center'>Nothing to show you :( I am really sorry for this T_T </p>"; } ?> 而不是dash,我可以从以下结果中确认:

bash

你需要将shebang $ ls -l /bin | grep sh . . lrwxrwxrwx 1 root root 4 Feb 19 2014 sh -> dash . . 放在脚本的开头 执行它

#!/bin/bash

或像

一样执行
/path/to/script

答案 1 :(得分:1)

顺便说一句,您的代码有多个错误和风格问题。

i=0
declare -a str_arr

# Notice IFS to use shell to parse line
# Notice -r to disable legacy behavior
while IFS='|'  read -r _ post _ dept _
do
    # Notice indent of loop body
    str_arr[$i]="$dept|$post"
    i=$(( i+1 ))
done< emp_info.dat

# Notice quoting
echo "${str_arr[@]}"

事实上,很多时候你应该只是在循环中读取它们时处理它们,而不是将它们累积到一个数组中,在这种情况下你可能根本不需要仅使用Bash的功能;但也许这是一个更大的程序的一部分,你确实需要通过数字索引随机访问所有值。

awk -F '|' '{ print $4 OFS $2 }' emp_info.dat