如何逐行读取文件

时间:2014-08-22 19:25:09

标签: arrays linux bash shell

我尝试逐行阅读文件。

要阅读的文件:

polkit|0.105
NetworkManager|0.9.4.0
GConf|3.2.5
libgnome-keyring|3.4.1
mozilla-nss|3.13.5
network-manager-applet|0.9.4.1
...

脚本:

COUNTER=1
until [ $COUNTER == '$(sed $= -n /tmp/packages-install)' ]; do
    FIRST[$COUNTER]=$(head -n $COUNTER /tmp/packages-install | cut -d\| -f 1)
    version[$COUNTER]=$(head -n $COUNTER /tmp/packages-install | cut -d\| -f 2)
    echo "${FIRST[$COUNTER]}"
    let COUNTER=COUNTER+1
done

echo "${FIRST[2]}"

MYARRAY=()

for ((i=1; i < ${#FIRST[@]} ; i++)); do
    MYARRAY=( ${MYARRAY[@]} ${FIRST[$i]} ${version[$i]} )
done

Xdialog --menubox Choose 20 100 1 "${MYARRAY[@]}"

当我执行脚本时,将打开此窗口: (注意一些值是如何重复的,内容不能在名称和版本之间正确交替): Xdialog window

我想创建一个包含所有包名和版本的数组。

1 个答案:

答案 0 :(得分:4)

你根本不需要一个计数器,每一行调用head两次是非常低效的。

array=( )
while IFS='|' read -r name version; do
  echo "Package $name is at version $version" >&2
  array+=( "$name" "$version" )
done </tmp/packages-install

请参阅BashFAQ #001: How can I read a file (data stream, variable) line-by-line (and/or field-by-field)?