Вы не упоминаете, какую оболочку вы планируете использовать, поэтому я буду использовать bash, хотя это довольно стандартные вещи для всех оболочек.
Аргументы файла
Доступ к аргументам можно получить через переменные $1
- $n
($0
возвращает команду, использованную для запуска программы). Скажем , у меня есть сценарий , который просто cat
S из п количества файлов с разделителем между ними:
#!/usr/bin/env bash
#
# Parameters:
# 1: string delimiter between arguments 2-n
# 2-n: file(s) to cat out
for arg in ${@:2} # $@ is the array of arguments, ${@:2} slices it starting at 2.
do
cat $arg
echo $1
done
В этом случае мы передаем имя файла в cat. Однако, если вы хотите преобразовать данные в файл (без явной записи и перезаписи), вы также можете сохранить содержимое файла в переменной:
file_contents=$(cat $filename)
[...do some stuff...]
echo $file_contents >> $new_filename
Читать со стандартного ввода
Что касается чтения из stdin, большинство оболочек имеют довольно стандартную встроенную функцию read
, хотя существуют различия в том, как указываются приглашения (по крайней мере).
Страница руководства по Bash buildins содержит довольно краткое объяснение read
, но я предпочитаю страницу Bash Hackers .
Просто:
read var_name
Несколько переменных
Чтобы установить несколько переменных, просто укажите несколько имен параметров для read
:
read var1 var2 var3
Затем read
поместит одно слово из stdin в каждую переменную, и все оставшиеся слова будут помещены в последнюю переменную.
λ read var1 var2 var3
thing1 thing2 thing3 thing4 thing5
λ echo $var1; echo $var2; echo $var3
thing1
thing2
thing3 thing4 thing5
Если введено меньше слов, чем переменных, оставшиеся переменные будут пустыми (даже если ранее установлено):
λ read var1 var2 var3
thing1 thing2
λ echo $var1; echo $var2; echo $var3
thing1
thing2
# Empty line
Запрашивает
Я часто использую флаг -p
для приглашения:
read -p "Enter filename: " filename
Примечание: ZSH и KSH (и, возможно, другие) используют другой синтаксис для запросов:
read "filename?Enter filename: " # Everything following the '?' is the prompt
Значения по умолчанию
Это не совсем трюк для read
, но я часто использую его в сочетании с read
. Например:
read -p "Y/[N]: " reply
reply=${reply:-N}
В принципе, если переменная (reply) существует, верните себя, но если она пуста, верните следующий параметр ("N").