2016-06-09 67 views
-3

下面是我的bash腳本代碼,用於複製數據,但我在SUBSTRING行中遇到語法錯誤。我是bash新手,所以無法理解語法的問題。任何幫助表示讚賞。我無法解決此bash腳本中的語法錯誤(版本4.1.2)

#!/bin/bash 



cd /var/www/html/zong/public/HostedPBX/ 

    for i in $(echo */); #..This loop shows number of directories in a 
folder to display them..... 
     do 

      echo /var/www/html/zong/public/HostedPBX/$i 
     done    echo"" echo "Above are the folders listed in current directory..." 

sleep 2  echo"" echo "Taking Backup of above folders...." 

sleep 3 

    for i in $(echo /var/www/html/zong/public/HostedPBX/*/); 

     **SUBSTRING=$(echo $i | cut -d'/' -f 7) 
#  $SUBSTRING=$(echo $i cut -d'/' -f 7)** ####...this also gives syntax error 
     do 
      cp -R $i /root/HostedPBX_Backup/$SUBSTRING    ##...Uncommment this line to copy files from HostePBX to HostedPBX_Backup..... 

      done 
+4

請看看[編輯的幫助( http://stackoverflow.com/editing-help)。 – Cyrus

+4

請看看:http://www.shellcheck.net/ – Cyrus

回答

1

bash中,變量的名稱只能包含大寫,小寫,數字和下劃線。在字符分類術語中,那將是:

[[:alnum:]_] 

此外,任何用戶定義變量的名稱都不能以數字開頭。

你的情況,你必須定義變量:

**SUBSTRING=.... 
$SUBSTRING=.... 

對於前面提到的原因,這些聲明是不正確的。

1

這不是爲了給你一個完整的解決方案,而是給予你有關錯誤的信息。

for循環可以用globs編寫,不需要echo和命令替換。其實從$(echo */)輸出將經歷word splittingglobbing如果沒有報價:

for i in *; do 
    [ -e "$i" ] || continue 
    .. 

好像你想從i在第二次迭代的基本部分。 Just use ${i##*/}這將刪除一切運算直到幷包括最後的斜線:

substring=${i##*/} 

第一個for循環中列舉當前directoty所有文件?你可以簡單地使用:

printf "%s\n" * 

Uppercase variable names are reserved for environment variables,不應該被應用程序使用。

完整的腳本將是這個樣子:

#!/bin/bash 
cd "/var/www/html/zong/public/HostedPBX/" || exit 5 
printf "/var/www/html/zong/public/HostedPBX/%s\n" * 
printf "\n" 
sleep 2 
printf "Taking Backup of above folders...\n" 
sleep 3 
for i in *; do 
    [ -e "$i" ] || continue 
    substring=${i##*/} 
    # Copy line below: 
    # cp -R -- "$i" "/root/HostedPBX_Backup/$substring" 
done 

你會正確地能夠使用更換整個腳本:

cd "/var/www/html/zong/public/HostedPBX/" || exit 5 
cp -R -- * "/root/HostedPBX_Backup/"