Bash скрипт для чтения файла - PullRequest
3 голосов
/ 16 июля 2010

Не уверен, почему последняя строка не вырезает "из скрипта:

#!/bin/bash

FILENAME=$1
while read line
do
cut -d '"' -f2
echo $line
done < $FILENAME

$ cat file

"1" test
"2" test
"3" test
"4" test
"5" test

Если я запускаю этот скрипт с помощью следующей команды:

$ ./test file

2
3
4
5
"1" test

Ответы [ 4 ]

7 голосов
/ 16 июля 2010

Цикл выполняется один раз.

  • Он читает "1" test в переменную $line.
  • Он выполняет cut -d '"' -f2, который читает строки 2-5 файла (потому чтоэто стандартный ввод в то время) и печатает число.
  • Это повторяет то, что он читает в первой строке.

Fix:

cut -d '"' -f2 $FILENAME

Если, с другой стороны, вы хотите получить числа в переменную, вы можете сделать это различными способами, включая:

cut -d '"' -f2 $FILENAME |
while read number
do  # What you want
    echo $number
done

или:

while read line
do
    number=$(echo "$line" | cut -d '"' -f2)
    echo $number
done
2 голосов
/ 17 июля 2010

Bash может сделать всю работу за вас. Нет необходимости в cut:

#!/bin/bash

FILENAME=$1
while read -r -a line
do
    echo ${line//\"}
done < "$FILENAME"

Это читает строку в массив, затем обрабатывает массив как скаляр, который дает вам первый элемент. Затем расширение скобки в echo удаляет кавычки.

Или вы можете позволить cut сделать всю работу и дать Bash долгий перерыв на кофе:

FILENAME=$1
cut -d '"' -f2 "$FILENAME"

Всегда заключайте в кавычки переменные, которые содержат имена файлов.

0 голосов
/ 17 июля 2010

, как упоминалось Денисом, нет необходимости использовать внешние команды

$ while read -r line; do  set -- $line;  echo ${1//\"/}; done<file
1
2
3
4
5

Но внешние команды выполняются быстрее, если у вас очень большие файлы.

$ cut -d'"' -f2 file
1
2
3
4
5
$ awk -F'"' '{print $2}' file
1
2
3
4
5
$ sed 's/^"//;s/".*//' file
1
2
3
4
5
0 голосов
/ 16 июля 2010

Джонатан Леффлер предоставил вам более простой метод (который также будет более эффективным), но в случае, если это упрощение для того, что вы собираетесь расширить (где просто вызов cut не будет делать то, что вы хотите), иВ любом случае, просто чтобы продемонстрировать принцип, ваш код должен быть исправлен так, чтобы каждая строка явно передавалась в stdin следующим образом:

#!/bin/bash

FILENAME=$1
while read line
do
    echo $line | cut -d '"' -f2
done < $FILENAME
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...