Сценарии оболочки, принимающие 2 аргумента - PullRequest
0 голосов
/ 04 марта 2020

Я создал скрипт оболочки с именем am.sh, который создает и помещает текст в файл. Теперь я хочу создать еще один скрипт, который будет принимать текстовый файл, который am.sh создал, скажем, words.txt и число, поэтому с помощью команды:

./bm.sh words.txt 5

будут выведены первые 5 слов, содержащихся в words.txt файл.

Я довольно застрял, поскольку все сценарии, которые я делал до этого момента, используют только один аргумент. До сих пор я придумал:

#!/bin/sh
grep '[A-Za-z]' | while read
do
echo " $a "
done

, но мне нужен способ принять количество слов, которое хочет пользователь, затем мне нужно создать al oop, который будет выводиться из текстового файла.

Ответы [ 2 ]

0 голосов
/ 05 марта 2020

Предполагая, что файл, сгенерированный am.sh, содержит одно слово в строке, вы можете использовать:

#!/bin/sh

[ $# = 2 ] || { echo "Usage: $(basename "$0" .sh) file numlines" >&2; exit 1; }

sed "${2}q" "$1"

Первая строка кода проверяет наличие двух аргументов и указывает, как использовать команду и завершается с ошибкой, если их нет.

Вторая строка использовала sed для печати первых строк файла. Эквивалентно, вы можете использовать head для печати первых строк файла:

head -n "$2" "$1"

Если в файле может быть несколько слов, то вы можете использовать:

tr -s '[[:space:]]' '\n' < "$1" |
sed "${2}q"

(или head -n "$2").

Обратите внимание, что скрипт не проверяет, является ли $1 файлом, который доступен для чтения, или что $2 является целым числом, большим нуля.

0 голосов
/ 04 марта 2020

Так вот, что сработало для меня:

#!/bin/sh

file=$1
word_count=$2
fields=$(echo $(seq 1 $word_count) | sed 's/\s/,/g')

head -n 1 $file | cut -d ' ' -f$fields

Позиционный параметр один ($1) должен быть именем файла, который создал ваш первый скрипт. Второй ($2) - это количество слов, которые должны быть напечатаны.

Я предполагаю, что слова разделяются одним пробелом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...