2

我正在尝试编写一个 bash 脚本,该脚本获取用户主目录并循环遍历第一级子目录,并且仅当它不是 /Library 或 /Public 文件夹时才对这些目录执行一些维护。我到目前为止的代码不起作用,因为我收到一条错误消息,指出 $dir 返回的目录名称是一个目录。这是代码:

#!/bin/bash

user="short name"
source_root="/Users/"

source_use="$source_root$user"
cd "$source_use"

dirarr=( */ )

echo ${dirarr[@]}

for dir in "${dirarr[@]}"
do 
    if ( "$dir" -ne "/Library" -o "$dir" -ne "/Public")
        then echo $dir.
            # do something
    fi
done

任何人都可以帮我完成这项工作。

非常感谢

4

2 回答 2

1

您的脚本有几个问题:

  1. 您需要在语句中使用[ ]or ,而不是. 在您的示例中,创建一个子外壳并尝试运行一个命令,这就是您收到您看到的错误消息的原因。[[ ]]if( )( )"$dir"

  2. 您正在与找不到的字符串进行比较 - 尝试"Library/""Public/"改为。

  3. 您可能想要-a而不是-o.

  4. -ne用于比较数字。你想要!=

这是您的脚本的更正版本:

#!/bin/bash

user="short name"
source_root="/Users/"

source_use="$source_root$user"
cd "$source_use"

dirarr=( */ )

echo ${dirarr[@]}

for dir in "${dirarr[@]}"
do 
    if [ "$dir" != "Library/" -a "$dir" != "Public/" ]
    then
        echo $dir.
        # do something
    fi
done
于 2012-12-20T23:21:53.403 回答
1

试试这个:

cd $source_root$user

for dir in `find . -maxdepth 1 -type d`
do
  if [ $dir = ./Library ] || [ $dir = ./Public ]
  then
    continue
  fi

  (Perform actions)
done

此外,bash 是倒退的。!=是字符串不等式,-ne是整数不等式。所以,也改为等号。

祝你好运!

于 2012-12-20T23:27:07.210 回答