2013-03-24 140 views
-1

嗨我想了解和了解变量在Bash中使用。要么我看错了,要么我弄错了概念,因为我看到无处不在如何初始化变量,但我没有看到如何使用该值的解释。使用Bash变量的值

例如:我有一个名为FILES的变量,它给了我X个字符串,我必须查找它们是否存在。事情是这样的:

FILES="inf.txt program.c" 

这只是有2个,我将不得不由1,如果存在的文件看1(.TXT和.C的人,他们是随机的例子,可能更多)。

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

我知道如何检查一个文件是否存在,用[-r File]-e或什么不是,但我没有这个变量的值。

回答

0

您可以通过$文件变量需要循环使用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 
+0

事情是,如何循环变量$文件的每个部分是文件?不知何故,这是隐含的吗? 对我来说,$ FILES的每个部分都是一个字符串,但也许我正在混合起来。 – keont 2013-03-24 10:52:35

+0

现在,它当然是一个字符串;但是当你将这个字符串与一个隐含文件的操作一起使用时,这个字符串被解释为一个文件名(例如'test -r'将一个字符串作为文件名进行解释)。 – 2013-03-24 10:55:05

+0

嗯,谢谢,这非常有趣...操作本身很简单,问题是/正在理解发生了什么。 如果变量$ FILE是一个日期或其他类型,并且我做了一个比较日期的操作,或者比较整数,那么它背后的原理是一样的吗? – keont 2013-03-24 11:12:18

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 

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

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

有了表情,如果你喜欢,你可以删除引号;他们都是强制性的,但是[...](我的意思是,代码将在没有引号的情况下执行,但前提是$f不包含空格)。