Я хотел бы использовать строки из 'wc' в качестве переменных. Например:
echo 'foo bar' > file.txt
echo 'blah blah blah' >> file.txt
wc file.txt
2 5 23 file.txt
Я хотел бы иметь что-то вроде $ lines
, $ words
и $ символов
, связанных со значениями 2
, 5
и 23
. Как это сделать в bash?
Существуют и другие решения, но я обычно использую простое, чтобы поместить вывод wc
во временный файл, а затем прочитать оттуда:
wc file.txt > xxx
read lines words characters filename < xxx
echo "lines=$lines words=$words characters=$characters filename=$filename"
lines=2 words=5 characters=23 filename=file.txt
Преимущество этого метода что вам не нужно создавать несколько awk
процессов, по одному для каждой переменной. Недостатком является то, что вам нужен временный файл, который вы должны удалить позже.
Будьте осторожны: это не работает:
wc file.txt | read lines words characters filename
Проблема в том, что передача в read
создает другой процесс, и переменные там обновляются, поэтому они не доступны в вызывающей оболочке.
Редактировать: добавление решения по arnaud576875:
read lines words chars filename <<< $(wc x)
Работает без записи в файл (и не имеет проблем с конвейером). Это специфично для Bash.
Из руководства по bash:
Here Strings
A variant of here documents, the format is:
<<<word
The word is expanded and supplied to the command on its standard input.
Ключ - это бит «слово расширено».
declare -a result
result=( $(wc < file.txt) )
lines=${result[0]}
words=${result[1]}
characters=${result[2]}
echo "Lines: $lines, Words: $words, Characters: $characters"
Просто добавить еще один вариант -
set -- `wc file.txt`
chars=$1
words=$2
lines=$3
Это, очевидно, забивает $*
и связанных с ним переменных. В отличие от некоторых других решений здесь, он переносим на другие оболочки Борна.