私はLinuxスクリプトに初めて触れたので、誰かがこの質問をしたら謝ります(公開する前にかなりの検索をしました)。
特定の文字の組み合わせがバックアップファイルに表示されることを確認する簡単なスクリプトを作成しています。これらのファイルのパスはデバイスによって異なり、ファイルが多いため、テキストファイルで確認する必要があるファイルのリストがあります。
私がやりたいことは、cat
ファイルを作成し、そのデバイスフォルダのパスにデバイス名を挿入してから、最新のバックアップファイルを確認することです。例えば
cat devicelist.txt | grep A[BCD] /folder1/folder2/$1/latest
これによりエラーが発生します。/latest: No such file or directory
それでは、私が何を間違っているのでしょうか?
答え1
お客様の要件を正しく理解したら、xargs
次のように使用できます。
cat devicelist.txt | xargs -d'\n' -I{} echo grep 'A[BCD]' "/folder1/folder2/{}/latest"
または(ファイルを直接読んでください)
xargs -a devicelist.txt -d'\n' -I{} echo grep 'A[BCD]' "/folder1/folder2/{}/latest"
echo
必要に応じて動作すると確信している場合は削除してください。
man xargs
詳細とプラットフォームで利用可能なオプションの完全なリストについては、リソースを参照してください。
答え2
$ 1は、スクリプトに渡されたパラメータ(最初のパラメータ)を表します。
だからあなたは使用することができます
#!/bin/bash
grep A[BCD] /folder1/folder2/"$1"/latest
役に立たないときはgrepを使用しないでください。 :) "$1" を使用すると、変数の内容を保存できます。
-bash-4.4$ mkdir test
-bash-4.4$ mkdir -p test/folder/a/latest
-bash-4.4$ cat > t.sh
#!/bin/sh
grep A[BCD] test/folder/"$1"/latest/toto
-bash-4.4$ chmod u+x t.sh
-bash-4.4$ echo ABCD > test/folder/a/latest/toto
-bash-4.4$ ./t.sh b
grep: test/folder/b/latest/toto: No such file or directory
-bash-4.4$ ./t.sh a
ABCD
-bash-4.4$ rm t.sh
-bash-4.4$ rm -rf test
-bash-4.4$
フォルダパスが見つからないときにgrepエラーメッセージを回避するには、存在しない$ 1の値をスクリプトに残すこともできます。
答え3
あなたはそれを使用することができます
grep 'A[BCD]' "/folder1/folder2/$1/latest" <devicelist.txt
パラメーターを使用して呼び出すスクリプトから。
シェルで同じ動作をシミュレートするには、まず次のことを行う必要があります。
set -- foo
それから$1
。foo