このコマンド ライン (`echo $1 | xargs -n 1 basename | cut -d '.' -f1`) は何を実行しますか?

このコマンド ライン (`echo $1 | xargs -n 1 basename | cut -d '.' -f1`) は何を実行しますか?

このコマンド ラインを理解する必要があります:

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と考えられます。basenamexargs

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

関連情報