bash如果语句检查路径匹配路径列表

时间:2017-08-09 03:14:09

标签: bash if-statement

我有一个脚本,我需要检查外部存储上是否存在目录,如果有任何不匹配,它应该退出 - 除了文件list中列出的那些

它们以完整路径列出,有时包含特殊字符,空格[]{}而不包含utf字符。每行有一条路径。

$ cat /data/list

/data/test [test] {test}
/data/test directory
/data/test name

我的脚本没有排除列表。检查排除列表不起作用。即,在列表中找到/data/test [test] {test}时它不会中断,而是退出,因为它在/external/data/处不存在。

我认为问题是匹配的,因为$(< / data / list)的格式没有换行符,但在我的实验中有和没有""=~等没有结果。

#!/bin/bash
for i in /data/storage/*; do
        if [[ ! -h "$i" ]]; then
                if [[ "$i" == "$(< /data/list)" ]]; then 
                break; else
                        if [ -e "/external//data/${i##*/}" ]; then
                        echo "/external/data/${i##*/} exists!"; else
                        echo "$i doesn't exist at /external/data/${i##*/}";
                        exit 1
                        fi
                fi
        fi
done

1 个答案:

答案 0 :(得分:1)

感谢shellter,我使用grep -F来匹配文字字符串

#!/bin/bash
for i in /data/storage/*; do
        if [[ ! -h "$i" ]]; then
                if grep -Fqx "$i" /data/list ; then
                echo "found ${i##*/} in list" || break; else
                        if [[ -e "/external/storage${i##*/}" ]]; then
                        echo "/external/storage/${i##*/} exists!"; else
                        echo "${i##*/} doesn't exist at /external/storage/${i##*/}";
                        exit 1
                        fi
                fi
        fi
done