gpt4 book ai didi

shell - 递归函数shell脚本

转载 作者:行者123 更新时间:2023-12-04 16:37:22 25 4
gpt4 key购买 nike

#!/bin/sh

param1=$1
param2=$2

recursive(){
mkdir -p $2
cd $1
for file in `ls $1`; do
[ $file = "." -o $file = ".." ] && continue
[ -d $file ] && recursive $1"/"$file $2"/"$file
[ -f $file ] && ln -s $1"/"$file $2"/"$file
done
}

recursive $param1 $param2

如果我执行这个脚本,它会调用 self(递归)。为什么不扫描所有目录?

(对不起:我的英语不好)

最佳答案

  1. 当通配符可以并且更可靠时,不要在反引号中调用 ls,即:

    for file in "$1"/*; do
  2. 变量扩展必须在引号,否则它会落在包括空格在内的任何特殊字符上。您应该使用 "$1""$2""$1/$file""$2/$file"

  3. 默认情况下,变量在 shell 中是全局的。因此,递归调用破坏了外部调用的 file 变量。有两种可能的解决方法:

    1. 声明局部变量

      local file

      在函数的开头。这是“bashishm”,即它不是由 POSIX shell 标准定义的,因此某些 shell 没有它。

    2. 将函数包裹在圆括号中而不是大括号中。这将使函数在子 shell 中运行,子 shell 不会破坏它的父变量。

  4. 哦,您不需要param1param2。位置参数是有范围的。

  5. William Pusell(参见其他答案)注意到另一件事。 或者 cd 进入参数目录或者将其作为路径前缀,但不要两者都做。

通过所有修复,您应该:

recursive() (
mkdir -p "$2"
for file in "$1"/*; do
[ "$file" = "." -o "$file" = ".." ] && continue
[ -d "$file" ] && recursive "$1/$file" "$2/$file"
[ -f "$file" ] && ln -s "$1/$file" "$2/$file"
done
)

recursive "$1" "$2"

我没有测试,所以可能还有一些问题。

关于shell - 递归函数shell脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8210636/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com