BashスクリプトのForループは、コマンドに異なる値を入力します。

BashスクリプトのForループは、コマンドに異なる値を入力します。

ユーザーが3つのフォルダ名を入力したら、他の名前をすべて$ colの場所に一度だけ配置したいと思います。

rsync -RravhP $Code --exclude "pub/$col" --exclude "$col" --exclude "$col" $destination;

#!/bin/bash

echo " enter source folder name" ;
read Code ;
echo " enter destination folder name"
read destination ; 

if [ $Code ] ;
then 
    echo " enter folders to exclude seperated by a space"
    read folders ; 
    colors="$folders"
    for col in "$colors"
    do
        rsync -RravhP $Code --exclude "pub/$col" --exclude "$col" --exclude "$col" $destination ; 
    done 
else 
    echo " something went wrong, please check foldername "
fi

答え1

--excludeユーザーが入力した名前ごとにフラグも作成したいとします。つまり、ユーザーが名前を入力したら、foo barコマンドラインに次の内容を含めたいと思いますか?

rsync ... --exclude foo --exclude bar ...

これでマークしたから、あなたが利用できるread -aユーザーが直接入力した単語を読んでください。大量に、必須パラメータを含む別の配列を構築しますrsync

read -a dirs
excludes=()
for d in "${dirs[@]}" ; do
    excludes+=(--exclude "$d")
done
rsync -RravhP "$Code" "${excludes[@]}" "$destination"

そうでない場合でも、2つの名前の合計を取得するのと同じものを入力して、スペースで名前をエスケープ-rできます。readaa bb\ ccaabb cc

答え2

以下では、二重引用符を削除する必要があります。

for col in "$colors"

それ以外の場合は、区切られたすべてのスペースが$colors1つとして表示されます$col

colors="$folders"この問題も発生する可能性があることに注意してください。以下をテストしてみることもできます。

for col in $folders

やっぱりそうです。内部のデータを直接読み取ることもできます$colors

クイックテストでは、次のことができます。

for n in "1 2 3"
do
    echo $n
done

結果は次のとおりです。

1 2 3

行に。

あなたがしたいことは:

for n in 1 2 3
do
   echo $n
done

2番目のケースでは、次のようになります。

1
2
3

フォルダの1つにスペースが含まれている場合は、すでに実行したループ内に引用符を使用できます。しかし、シェルスクリプトでファイル名のスペースを正しく処理することは常に非常に複雑です。動作していることを確認する最善の方法は、そのフォルダを使用してテストを実行することです。

答え3

これは私にとって効果的です。

**#!/bin/bash

echo " enter source folder name" ;
read Code ;
echo " enter destination folder name"
read destination ; 

echo " input folders to exclude" ;
read folders ;
input="$folders" 

echo the folders entered are $input
for cols in $input ;
do
echo $cols >> log.txt

rsync -RravhP --exclude-from log.txt $Code $destination

log.txt**

関連情報