当用户输入 3 个文件夹名称时,我希望将所有不同的名称放置在 $col 的位置一次
rsync -RravhP $Code --排除“pub/$col” --排除“$col” --排除“$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
如果您的文件夹之一包含空格,则可以在循环内部使用引号,您已经这样做了。但在 shell 脚本中正确处理文件名中的空格总是相当复杂。确保其正常工作的最佳方法是使用此类文件夹运行测试。
答案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**