사용자가 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
할 수 있습니다 .read
aa bb\ cc
aa
bb 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**