コマンドを引数として渡すbashスクリプト

コマンドを引数として渡すbashスクリプト

選択は、スクリプトの実行時に送信されたパラメーターに基づいている必要があります。

#!/bin/bash

#This script echoes a text and creates a file

echo "welcome. Will create a file with content in this folder"

ls -l | grep .txt > files_in_folder

答え1

スクリプトユーザーがファイル名のファイル名サフィックスを選択したい引数を使用しているとします.txt

#!/bin/sh

printf '%s\n' ./*"$1"

これにより、指定されたファイル名のサフィックスで終わる現在のディレクトリのすべての名前が一覧表示されます。このprintfコマンドは、シェルがモードを拡張すると(最後にユーザーが指定した引数を含む)リストを生成し、フォーマットprintf文字列に基づいて行ごとに各リスト項目(この場合はファイル名)を出力します。ここで使用される書式文字列は、%s\n「改行文字が続く文字列」を意味するものです。

ls -l以下を使用してファイルメタデータを含む「長いリスト」を取得しますか?

#!/bin/sh

ls -ld ./*"$1"

-dこれは、パターンに一致するディレクトリの内容がリストされないようにするために必要です。同様に、シェルは与えられたパターンを拡張し、一致するls -ldファイル名のリストを使用してそれを呼び出します。

サブディレクトリに名前を含めるには、次のようにしますbash

#!/bin/bash

shopt -s globstar
printf '%s\n' ./**/*"$1"

**このオプションを使用してパターンを有効にすると、パターンはサブディレクトリに繰り返し一致しますglobstar。明らかに上記のパターンを使用することもできますが、ls -ldパターンが次のように拡張されると壊れる可能性があります。数千ファイル名。

リストを次に制限一般ファイル(つまり、ディレクトリ名などではなく隠された名前を含む)サブディレクトリに移動している間:

#!/bin/sh

find . -name "*$1" -type f

-ls出力に似た内容が必要な場合は、endに追加してくださいls -ld

これは何千もの一致するファイル名がある場合でも機能しますが、パラメータにファイル名ワイルドカードを含めることはできません(たとえば、パラメータをプレイブックとして指定した.*場合など)。'.*'

すべての場合に$1引用する必要があります。findコマンド内の独自のパターンマッチングと同様に、*引用符で囲む必要があります。それ以外の場合は、シェルが拡張できるように引用符をオフにする必要があります。find-name*

スクリプト内またはスクリプトを実行する場合(要件の一部である場合)、出力をファイルにリダイレクトします。

上記のスクリプトのすべてのバリエーションは同じ方法で呼び出されます。

./myscript.sh .txt

答え2

次のように使用できます。 (スクリプトに渡されたパラメータのすべての二重引用符に注意してください)

#!/usr/bin/bash
first_cmd="$1"
second_cmd="$2"
$first_cmd | $second_cmd > outputfile.txt

実装する:

$ ./temp.sh "ls -lrt" "grep '\.txt$'"

出力を確認してください。

$ cat outputfile.txt 
***all the filename with .txt will print

関連情報