2016-06-09 48 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/"