У меня есть файл с именем «krylov_methods», который имеет такой текст:
cg - preconditioned
cgne - normal equations
nash - cg subject to constraint
stcg - another method for constraints
gmres - general minimum residual
...
Мне нужно извлечь первое слово (строку символов), одну за другой, в сценарии оболочки и использовать его в качестве аргумента командной строки в этом скрипте. Чтобы извлечь первое слово, я использовал следующую команду:
head -1 krylov_methods | tail -1 | awk '{print $1}'
head -2 krylov_methods | tail -1 | awk '{print $1}'
head -3 krylov_methods | tail -1 | awk '{print $1}'
...
Кажется, это хорошо работает для извлечения первого слова каждой строки одна за другой. Однако мне нужно иметь возможность сохранить строку символов как переменная для будущего использования в скрипте. Например, поскольку первое слово в первой строке файла «krylov_methods» - это слово «cg», я хочу иметь возможность хранить «cg» в переменной с именем «method». Внутри скрипта я хотел бы получить что-то вроде:
method=cg
./execute $method
Можно ли сохранить результат команды head, использованной в скрипте оболочки?
Примерно так
#!/bin/bash
while read line; do
set -- $line
method=$1
/path/to/execute $method
done
Вы также можете прочитать первое слово в массив.
http://www.thegeekstuff.com/2010/06/bash-array-tutorial/
read
может изолировать каждый компонент строки:
#!/bin/bash
while read METHOD MINUS COMMENT
do
echo "METHOD = $METHOD"
echo "COMMENT = $COMMENT"
/path/to/execute $METHOD
done
в некоторой степени зависит от того, что вы делаете с информацией и как вы хотите ее вызвать позже.
На самом деле, после некоторых экспериментов, я понял это:
method=$(head -$i krylov_methods | tail -1 | awk '{print $1}')
execute $method
Нет никакой потребности использовать обоих head
и tail
. AWK
может распечатать строку, которой Вы говорите это довольно легко
$> awk -v LINE=5 'NR==LINE' /etc/passwd
sync:x:4:65534:sync:/bin:/bin/sync
Можно превратить это в функцию в Вашем bash
сценарий (не забывают заключать весь или частичный путь в кавычки к файлу, если он имеет пробелы или специальные символы):
print_line_number() {
awk -v LINE="$1" "NR==LINE" "$2"
}
И здесь это в действии
$> print_line_number 5 /etc/passwd
sync:x:4:65534:sync:/bin:/bin/sync