オートコンプリート機能を使用してスクリプトにファイル名を渡す

オートコンプリート機能を使用してスクリプトにファイル名を渡す

通常、スクリプト内でファイル名を使用する場合は、スクリプト内でファイル名を明示的に指定します。たとえば、次のようになります。

#!/bin/bash ... echo "<dynamic text>" >> process_log.log ...

次のようにファイル名をスクリプトに渡すことが可能かどうか疑問に思っています。

./script_name.sh file_1 file_2 file_3

タブの自動補完機能付き。(これは非常に便利です!)

誰かこれに経験がある人はいますか。ありがとうございます。


read入力データを要求する方法の 1 つですが、複数の入力や長いテキストの場合は面倒だと感じます。

答え1

このスクリプトは、必須の引数を 1 つと、オプションの引数を 2 つ取ります。少なくとも 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

渡した 3 つの引数 (すべて「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

関連情報