私はLinuxでスクリプトを初めて使用します。
各行には、1つ以上のスペースで区切られた2つの文字列(ファイルパス)を含む入力テキストファイルがあります。
私は最初の文字列(パス)にリストされているファイルを渡し、そのファイルを2番目の文字列(パス)にコピーし、各入力ファイルの各行に対して繰り返す自動スクリプトファイルを作成しています。
入力ファイルにリストされているすべてのファイルを含む.zipファイルがあります。
次のようになります。
/path/to/file.x /different/path/to/file.x
/path/to/file2.x /different/path/to/file2.x
など。
ここで file.x が渡され、別の .zip ファイルから別のパスにコピーされます。
各入力ファイルには、異なる行数と異なるパスを持つ一意の.zipがあります。
私はスクリプトを実行してみるかと思いました。
~$ ./script.sh files.zip map.txt
次にスクリプトを作成します。
zipfile = "$1"
map = "$2"
externalprogram "$zipfile" "$map"
while IFS='' read -r line;
do
VAR_STR=$line
aLeng=${#VAR_STR[@]}
IFS=/ read -a arr <<< "$VAR_STR"
FILE="${arr[${aLeng}]-1}"
cp <path to zip file>/$FILE /different/path/
done < "$map"
明らかにかなり複雑で、2番目のパスを同じ行の変数として渡す方法がわかりません。
どんな意見でも感謝します。ありがとうございます。
編集:スクリプトの実行について言及したところにmap.txtを置くことを意味しました。また、これは私にはかなり複雑だと言いたいです。まだLinuxを学ぶにはたくさんのことがあります^_^
ベストアンサー1
あなたの質問は、特定の質問ではなくコメントを一般的に要求することですので、ここにいくつかのコメントがあります。
- このコマンドを最大限に活用できないようです
read
。たとえば、複数のフィールドを一意に変数に読み込むために簡単に使用できる方法については、マニュアルページのドキュメントを確認してください。read path1 path2
。 - なぜ割り当てようとしますか
VAR_STR=$line
?私の考えには直接できるようです$line
。 - 2番目のフィールドでパスを切り取る方法は賢いですが、他のほとんどのシェルにはイディオムを使用して変数からプレフィックスパターンを削除する簡単で簡単で
bash
効率的な方法があります。 。繰り返しますが、シェルが基本的に非常に効率的に実行できる他のクールなタスクについては、マニュアルページを参照してください。#
FILE=${path2##*/}
- bash変数のプライベート命名規則をすべて小文字またはすべて大文字に正規化しますが、混在しないでください。
- 「明らかに…」で始まるあなたの結論は私にとっては全く明確ではありません。私はあなたが何を意味するのか分からないからです。