Передача имени файла в скрипты с функцией автозаполнения

Передача имени файла в скрипты с функцией автозаполнения

Обычно, когда я использую имена файлов в скрипте, я явно упоминаю имя файла в скрипте, например, как показано ниже:

#!/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.

Связанный контент