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

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

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

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

ベストアンサー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ファイル名を残りのパスと区別します。

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

おすすめ記事