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"

그렇지 않은 경우 에도 두 이름의 합을 구하는 것과 같은 것을 입력하여 공백으로 이름을 이스케이프 -r할 수 있습니다 .readaa bb\ ccaabb cc

답변2

다음에서는 큰따옴표를 제거해야 합니다.

for col in "$colors"

그렇지 않으면 분리된 모든 공백이 $colors하나로 표시됩니다 $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

두 번째 경우에는 다음을 얻습니다.

1
2
3

폴더 중 하나에 공백이 포함된 경우 이미 수행한 루프 내부에 따옴표를 사용할 수 있습니다. 그러나 쉘 스크립트에서 파일 이름의 공백을 올바르게 처리하는 것은 항상 매우 복잡합니다. 작동하는지 확인하는 가장 좋은 방법은 해당 폴더를 사용하여 테스트를 실행하는 것입니다.

답변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**

관련 정보