2016-06-20 179 views
0

我試圖寫一個bash腳本,將做到以下幾點:意外結束在while循環在bash

  1. 以一個目錄或文件作爲輸入(總是以到/ mnt /用戶/開頭)
  2. 爲同一個文件或目錄
  3. 搜索其他掛載點
  4. 返回值

所以(總是以到/ mnt/diskx開始),例如,輸入將是「到/ mnt /用戶/ my_files/file.txt的」。它會搜索「」/mnt/disk1/my_files/file.txt「是否存在,並會逐漸查找每個磁盤(disk2,disk3等),直到找到它或disk20。

這是我迄今爲止:

#/user/bin/bash 
var=$1 
i=0 
while [ -e $check_var = echo $var | sed 's:/mnt/user:/mnt/disk$i+1:'] 
do 
final=$check_var 
done 

它不完全是,但我不是在bash,所以我做了一點在一次精通我敢肯定,我命令將無法正常工作或者還沒有,但現在我得到一個「意外的文件結尾」,我想不通爲什麼

+0

爲什麼要重新發明輪子?你有沒有聽說過'find'命令? –

+0

您的條件語法不正確,可能是導致意外的EOF錯誤的原因。 – Aaron

+0

你在嘗試什麼:'-e $ check_var = echo $ var'?在最後的']'之前缺少一個空格,並且'sed'替換內的'$ i'不會被替換,因爲您使用的是單引號而不是double。 – cdarke

回答

2

有許多問題在這裏:

  • 如果這是實際得到的「意外的文件結束」代碼,則應將該文件保存爲Unix格式,而不是DOS格式。
  • 的家當應該是#!/usr/bin/bash#!/bin/bash根據您的系統
  • 你必須運行在它之前[ .. ]分配check_var上。
  • 你必須使用$(..)擴大命令
  • 變量,如$i沒有在單引號
  • 擴大
  • sed不能添加數字
  • i沒有被增加
  • 循環邏輯反轉,它應循環直到它匹配而不匹配。
  • 你不想在循環中指定final

考慮以更小的塊進行調試,這樣更容易調試,例如,單個語句sed 's:/mnt/user:/mnt/disk$i+1:'比您的整個while循環。

這裏做的更規範的方法:

#!/bin/bash 
var="${1#/mnt/user/}" 
for file in /mnt/disk{1..20}/"$var" 
do 
    [[ -e "$file" ]] && final="$file" && break 
done 

if [[ $final ]] 
then 
    echo "It exists at $final" 
else 
    echo "It doesn't exist anywhere" 
fi 
+0

謝謝,這有助於很多。我改變了shebang,因爲我得到了一個錯誤,但是在我回顧了這些評論之後,這是因爲我認爲我修復了CR問題。與我最初的「意外的EOF」錯誤一樣。我從來沒有增加我,因爲我沒有得到那麼多。 – user2328273