コマンドラインでファイル名をパラメータとして渡す方法は? [閉鎖]

コマンドラインでファイル名をパラメータとして渡す方法は? [閉鎖]

コマンドラインからファイル名を引数として取得するプロジェクトを開始しています。他の場所ではこれに関する情報が見つかりません。これが最初のステップなので、まだコードがありません。

助けてくれてありがとう。ここで提案できるすべての提案を積極的に試してみましょう。

答え1

位置パラメータの取り扱い

まずはっきりしておきます。 bashスクリプトを参照すると、コマンドラインパラメータは「場所パラメータ」と呼ばれます。つまり、$1。これが私がここで使用する用語です。$2$3

正しいシェル構文によると、位置パラメータはコマンドの後に表示されます(明らかに一部の人は話すことはできないと言うかもしれませんが、構文は重要です):

command a b c

commandそれがあなたのスクリプトだとしますmy_script.sh。スクリプトとecho $1同じパラメータに対して個別のコマンドを実行できますecho $2。あなたも参加できますみんなforループを介してすぐに取得します。たとえば、単純なスクリプトは次のようになります。

#!/bin/sh
# Note important difference between /bin/sh and /bin/bash
# https://askubuntu.com/q/141928/295286

echo "$1"

# for loop will substitute each $1, $2,$3 value into i each time
for i
do
    echo "$i"
done

ファイル名部分の解決

位置パラメータは何でも(数値またはテキスト)可能であるという事実は、解釈をスクリプト作成者に任せます。テキスト文字列がファイル名の場合は、当然ファイルシステムのどこかに存在する必要があります(匿名のファイル、パイプ、またはソケットとは異なり、[ここで引用が必要])。

my_script "this_is_my_file.txt". Simple way to test whetherthis_is_my_file.txt`が既存のファイル名であるため、スクリプトを呼び出すとします。

test -f "$1"

または

[ -f "$1" ]

なぜ?$1これは最初の位置パラメータであるためです。なぜtestまたは[?なぜなら同じコマンドだからです。そこでは、使えます

if [ -f "$1" ]; then
    echo "$1" exists
fi

または

[ -f "$1" ] && echo "$1" exists

もちろん、良いスクリプトであればエラーを発生させ、ファイルが存在しない場合はスクリプトを終了させるのが賢明でしょう。

スクリプティングにとって重要なことの1つは、スクリプティングをする習慣を挙げることです。ユーザーがスクリプトに提供するファイル名を予測できないため、任意のファイル名にすることができます-。つまり、-afilename。これらのファイル名は、場所引数を処理する必要があるスクリプトや一般的なコマンドを破損することがよくあります。ファイル名が存在すると予想または特別に要求する場合現在の作業ディレクトリに、変数の前に使用するのが最善です./

if [ -f ./"$1" ]

ユーザーが明示的にそう言っていても、まだ機能./します。

$ test -f ././input.txt && echo "YES"
YES

ファイルパスも含むファイル名を処理する場合は問題になりません。ファイル名の前の最後のスラッシュは、/path/to/-difficult_name.txtファイル名を残りのパスと区別します。

...後で編集して拡張してください...

答え2

引数を使用してスクリプトを呼び出すと、その引数がスクリプトに引数として渡されます。位置パラメータ。これらのパラメータは$1、...を使用して$2呼び出すことができます${10}${11} 注:すべての2桁のパラメータには括弧が必要です。

また、$@$*のようなすべてのパラメータを表すために使用できます。

($*) は 1 から始まる位置パラメータに展開されます。拡張が二重引用符内にない場合、各位置引数は別々の単語に展開されます。これらの単語は、実行されるコンテキストで単語分割とパス名拡張がさらに適用されます。二重引用符内で拡張が発生すると、IFS特殊変数の最初の文字で区切られた各引数の値を使用して単一の単語に展開されます。つまり、「$*」は「$1c$2c...」と同じです。ここで、cはIFS変数値の最初の文字です。 IFSが設定されていない場合、パラメーターはスペースで区切られます。 IFS が空の場合、パラメーターの連結時に区切り文字は挿入されません。

そして

($ @)は1から始まる位置パラメータに展開されます。二重引用符内で拡張が発生すると、各引数は別々の単語に展開されます。つまり、「$@」は「$1」「$2」に等しくなります。の最後の部分に関連付けられています。位置引数がない場合、「$@」と$@は何も拡張されません(つまり削除されます)。

以下は、この例を示すスクリプトです。

スクリプト

#!/bin/sh

echo "My arguments are $@"

echo "$1 -- $2 -- $3 -- $4 -- $5 -- $6 -- $7 -- $8 -- $9 -- $10"

echo "Correct parameter 10 is ${10}"

行動中

$ ./script one two three four five six seven eight nine ten
My arguments are one two three four five six seven eight nine ten
one -- two -- three -- four -- five -- six -- seven -- eight -- nine -- one0
Correct parameter 10 is ten

バッシュリファレンスマニュアル3.4 シェルパラメータ

関連情報