bash 脚本中的 for 循环,在命令中放入不同的值

bash 脚本中的 for 循环,在命令中放入不同的值

当用户输入 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\ 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

如果您的文件夹之一包含空格,则可以在循环内部使用引号,您已经这样做了。但在 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**

相关内容