我正在尝试编写一个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
任何人都可以帮我解决这个问题。
非常感谢
答案 0 :(得分:1)
您的脚本有几个问题:
您需要在[ ]
声明中使用[[ ]]
或if
,而不是( )
。在您的示例中,( )
创建了一个子shell并尝试运行命令"$dir"
,这就是您收到错误消息的原因。
您正在与您找不到的字符串进行比较 - 请尝试使用"Library/"
和"Public/"
。
您可能需要-a
而不是-o
。
-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
答案 1 :(得分: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
是整数不相等。所以,也要改为等于标志。