このコマンド ラインを理解する必要があります:
file=`echo $1 | xargs -n 1 basename | cut -d '.' -f1`
答え1
ファイル名のビット(パスを含む場合もあります)を変数 に割り当てますfile
。具体的には、ファイル自体のファイル名の最初の文字の前のビットです.
。つまり、 のようなものを取得して/some/path/hello.world
、そのビットを解析しますhello
。
ヒントとしては、パイプラインの各部分をコマンド ラインで実行することです。
$ thing="/some/path/hello.world"
$ echo "$thing"
/some/path/hello.world
$ echo "$thing" | xargs -n 1 basename
hello.world
$ echo "$thing" | xargs -n 1 basename | cut -d '.' -f 1
hello
バックティックは、パイプラインの出力を返して に割り当てるために使用されますfile
。 は$1
、コマンド ラインの最初の引数です (これが含まれたスクリプトまたはシェル関数の場合)。
おそらく、xargs -n 1 basename
プレーンではなく が使用される唯一の理由は、ユーティリティが標準入力から読み取らないからであるbasename
と考えられます。basename
xargs
bash
またはの同じものの短縮版(そして高速版)は次ksh93
のようになります。
file=${1##*/}
file=${file%%.*}
答え2
この行は、(この行が出現するスクリプトの最初の引数)を介して提供されるパスから拡張子なしのファイル名を抽出します$1
。結果は変数に保存されますfile
。
デモ:
$ echo /etc/dhcpcd.conf ../foo/bar/filename.tar.gz | xargs -n 1 basename | cut -d '.' -f1
dhcpcd
filename
答え3
echo
ここでのとの組み合わせはxargs
かなり興味深いものです。
basename
は、コマンド ラインでパス名を受け取り、その最後のコンポーネント (つまり、通常は最後のスラッシュの後の部分) を出力します。xargs
入力 (パイプ) から読み取った単語を、basename
ここのコマンド ラインに配置するだけです。では、 を使用しないのはなぜでしょうかbasename $1
。
しかし、違いはあります。
echo $1 | xargs -n 1 basename
パラメータに空白が含まれている場合は、$1
スペースxargs
で分割し、basename
各単語を個別に呼び出します。最終的には、ファイル名の一部が抽出されます。全て言葉は、アルミニウスは。
他のオプションはbasename $1
、 を 1 回だけ呼び出しますbasename
(単語の分割により、何らかの理由で失敗します)。
コマンドが 1 つのファイル名のみを処理する場合は、次のように記述する方が適切です。
file=$(basename "$1" | cut -d '.' -f 1)
引用符で囲みます。(${file%%.*}
またはcut
、クサラナンダは。
一方、複数のファイル名を処理する場合は、配列を使用して渡すか、位置パラメータ( だけでなくすべて$1
)で渡す方がきれいかもしれません。
答え4
この行は、拡張子とパスを除いたファイル名を変数に格納します$file
。
詳細に:
echo $1
スクリプトに渡された最初のコマンドライン引数を出力し、xargs -n 1 basename
エコーされた文字列をコマンドに引数として渡しますbasename
。これにより、ファイル名からパスが削除されます。
cut -d '.' -f1
拡張子が削除されます。
例えば、
echo directory/test.sh | xargs -n 1 basename | cut -d '.' -f1
結果 ( に保存$file
) は になりますtest
。