コマンド出力をパラメータリストとしてスクリプトに渡すにはどうすればよいですか?

コマンド出力をパラメータリストとしてスクリプトに渡すにはどうすればよいですか?

現在のディレクトリにあるすべてのファイルの先頭にコンテンツを追加したいと思います。現在の作業ディレクトリからすべてのファイル名を一度に取得し、引数として渡す方法を学ぶ必要があります。各ファイルをスクリプトの引数として手動で指定することで、これを行う必要はありません。私はこの新しい知識を追加のスクリプトに使用したいと思います。私は側面や他の解決策は必要ありません。 command(ls)出力を取得してパラメータに渡す方法を学ぶ必要があります。私はこれを試しましたが失敗しました。

./file-edit.sh $(ls)
./file-edit.sh `ls`

これは私の作業スクリプトです。

#!/bin/bash
lineno=2            # Append from line 2 
BAD_ARGS=85         # Error code

string0="###################################################################"
string2="#Description    :"
string3="#Date           :`date +%d-%B-%Y`"
string4="#Author         :Milos Stojanovic"
string5="#Contact:       :https://www.linkedin.com/in/xxx/"
string6="###################################################################"
# Can be any other strings

if [ ! -f $1 ]; then
        echo "Please specify at least 1 filename as an argument!"
        exit $BAD_ARGS
fi

until [ -z  "$1" ]
do
        string1="#Script Name    :$1"
        file=$1;
        sed -i ""$lineno"i $string0\n$string1\n$string2\n$string3\n$string4\n$string5\n$string6" $file
        echo "File "\'$file\'" altered at line number: $lineno"
        shift 1
done

exit 0

ベストアンサー1

スクリプトで各パラメータを個別に処理するには、次のようにスクリプトでループを使用します。

for pathname do

    # Insert code here that uses "$pathname".
    # You will not need to shift arguments.

done

現在のディレクトリのすべての名前でスクリプトを呼び出すには、次のようにします。

./script.sh ./*

シェルは、./*パターンを現在のディレクトリのすべての名前を含むリストに展開します。

使用に比べて利点は、有効な文字(スペース、タブ、改行を含む)を含むファイル名をls使用しないため、処理できることです。ls

あるいは、ファイル名ワイルドカードをスクリプト自体に移動することもできます(コマンドラインでスクリプトに引数を提供する必要はありません)。

for pathname in ./*; do
    # Insert code here that uses "$pathname".
done

スクリプトが通常のファイルを参照する名前と非伝統的なファイル(ディレクトリなど)を参照する名前とを区別する必要がある場合は、-fループでテストを使用してください。

# skip non-regular files
[ ! -f "$pathname" ] && continue

これにより、通常のファイルへのシンボリックリンクが可能になります。これもスキップするには、テストを次に変更してください。

if [ ! -f "$pathname" ] || [ -L "$pathname" ]; then
    # Skip non-regular files and symbolic links.
    continue
fi

その他の提案:

文字列に改行文字を含む複数行文字列を変数に割り当てることができます。

boilerplate='Hello and welcome!
This is my program.
Enjoy'

テキスト文書の2行目の後にテキストを挿入するにはsed-iここでは内部編集に使用されます)を使用します。

printf '%s\n' "$boilerplate" | sed -i '2r /dev/stdin' somefile

またはこちらのドキュメントを使用して

sed -i '2r /dev/stdin' somefile <<END_BOILERPLATE
Hello and welcome!
This is my program.
Enjoy
END_BOILERPLATE

おすすめ記事