
Обычно, когда я использую имена файлов в скрипте, я явно упоминаю имя файла в скрипте, например, как показано ниже:
#!/bin/bash ... echo "<dynamic text>" >> process_log.log ...
Мне было интересно, возможно ли передать имя файла в скрипт следующим образом:
./script_name.sh file_1 file_2 file_3
с функцией автозаполнения вкладок. (Это было бы очень удобно!)
Есть ли у кого-нибудь опыт с этим? Спасибо.
read
это один из способов запросить некоторые входные данные, но я считаю, что это неудобно для множественных входных данных и для длинного текста.
решение1
Хорошо, этот скрипт принимает один обязательный аргумент и два необязательных аргумента. Он выйдет (с ошибкой), если вы не укажете хотя бы один аргумент. Он не делает ничего, кроме этого!
#!/bin/sh
if [ -z "$1" ]
then
echo "Missing filename: 1"
exit 1
else
file1=$1
fi
file2="$2"
file3="$3"
printf "File 1: %s\n" "$file1"
printf "File 2: %s\n" "$file2"
printf "File 3: %s\n" "$file3"
cat "$file1"
Сохраните его как (например) script_name.sh
и сделайте его исполняемым файлом:
chmod u+x script_name.sh
Затем запустите его следующим образом:
./script_name.sh script_name.sh script_name.sh script_name.sh
Он должен отобразить три переданных вами аргумента (все они — «script_name.sh»), а затем cat
самого себя.
Когда я попробовал это, я поэкспериментировал с автодополнением по табуляции — оно работало нормально автоматически (показывало файлы и каталоги, когда я нажимал Tab). Я ничего не делал, чтобы заставить его это делать. Однако, если вы хотите, чтобы ваш скрипт работал только с определенными файлами complete -f -X '!*.png' script_name.sh
— он будет показывать только файлы ".png" при нажатии Tab.
Отредактируйте, чтобы добавить:
complete
не запускается из самого скрипта ( script_name.sh
в примере выше). Создайте отдельный файл ( completion_for_script_name.sh
например):
complete -f -X '!*.png' script_name.sh
Используйте source
для загрузки завершения в текущую среду:
source ./completion_for_script_name.sh
Обычно это делается в профиле оболочки, например, .bash_profile
или .bashrc
.