2013-03-24 139 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不包含空格)。