-1

嗨,我正在尝试学习和理解Bash. 要么我看错了,要么我的概念错了,因为我到处都看到如何初始化变量,但我没有看到解释如何使用该值。

示例:我有一个名为 的变量FILES,它为我提供了 X 个字符串,如果它们存在,我必须查找它们。像这样的东西:

FILES="inf.txt program.c"

那只有 2 个,如果文件存在,我将不得不逐个查看(.txt 和 .c 文件,它们是随机的示例,可能更多)。

现在,我的问题是我不知道...将每个字符串或每个值分配给新顺序。如果它只是 1 个字符串,我想我可以寻找它,但是有几个我不知道在 bash 中是如何完成的。

而且我有点知道如何检查文件是否存在,有[-r File]-e没有,但我没有所述变量的值。

4

2 回答 2

1

执行此操作的正确方法bash是使用数组,而不是字符串。如果您有一个名称包含空格的文件怎么办?

$ FILES=( "name with    space.txt" inf.txt program.c )
$ for f in "${FILES[@]}"; do
>    echo "$f"
> done

我在第一个文件中放置了大量的空格,以强调$f在循环体中引用的重要性。尝试运行相同的代码,但使用echo $f(不带引号)。

在这一点上,它们只是字符串。bash不关心它们是否是文件名,除非您在需要文件名的上下文中使用它们,例如使用-f运算符(参数是文件吗?):

$ FILES=( "name with    space.txt" inf.txt program.c )
$ for f in "${FILES[@]}"; do
>    if [ -f "$f" ]; then
>        echo "$f is a file"
>    else
>        echo "$f is not a file"
>    fi
> done

但由于 this is bash, not sh,您应该使用条件表达式而不是test/[命令:

>    if [[ -f $f ]]; then

使用该表达式,您可以根据需要删除引号;它们几乎都是强制性的[...](我的意思是,代码将不带引号执行,但前提是不$f包含空格)。

于 2013-03-24T14:28:34.473 回答
0

您需要使用循环遍历 $FILE 变量for

for file in $FILES
do
[ -r "$file" ] && echo File $file exists and is readable || echo F*emphasized text*ile $file does not exists
done
于 2013-03-24T10:36:01.250 回答