2013-06-20 75 views
0

我写了一个bash脚本,用于在我的家庭服务器上传文件。它使用applescript从文件夹操作脚本中激活。安装程序是我桌面上的文件夹名为place_on_server。它应该有一个内部文件结构正是我想要写的文件夹,如:/无功/网络/媒体/ 用法是这样的:Bash脚本故障解释输入

  • 如果目录等加入到place_on_server:./upload DIR等
  • 如果目录的目录:ETC /电影./upload DIR等电影//等
  • 如果文件place_on_server:./upload˚FFILE.TXT
  • 如果文件在文件中place_on_server ./upload˚F etc file.txt //等

创建一个目录它应该执行这样的命令:

ssh [email protected]<<EOF 
cd /var/www/media/wherever 
mkdir newdirectory 
EOF 

和文件放置:

rsync -rsh='ssh -p22' file [email protected]:/var/www/media/wherever 

脚本:

#!/bin/bash 
addr=$(ifconfig -a | ./test) 
if ($# -le "1") 
then 
    exit 
elif ($1 -eq "DIR") 
then 
    f1="ssh -b [email protected]$addr<<EOF" 
    list = "cd /var/www/media\n" 
    if($# -eq "2") 
    then 
     list=list+"mkdir $2\nEOF\n" 
    else 
     num=2 
     i=$(($num)) 
     while($num < $#) 
     do 
      i=$(($num)) 
      list=list+"mkdir $i\n" 
      list=list+"cd $i\n" 
      $num=$num+1 
     done 
    fi 
    echo $list 
elif ($1 -eq "F") 
then 
    #list = "cd /var/www/media\n" 
    f2="rsync -rsh=\'ssh -p22\' " 
    f3 = "[email protected]$addr:/var/www/media" 
    if($# -eq "2") 
    then 
     f2=f2+$2+" "+f3 
    else 
     num=3 
     i=$(($num)) 
     while($num < $#) 
     do 
      i=$(($num)) 
      f2=f2+"/"+$i 
      $num=$num+1 
     done 
     i=$(($num)) 
     f2=f2+$i+" "+$f3 
    fi 
    echo $f2 
fi 
exit 

输出:

(prompt)$ ./upload2 F SO test.txt 
./upload2: line 3: 3: command not found 
./upload2: line 6: F: command not found 
./upload2: line 25: F: command not found 

所以,你可以看到我有处理输入的问题。自从我做了bash之后已经有一段时间了。从来没有广泛的开始。寻找解决我的问题,但也建议。提前致谢。

回答

2
  1. 要进行比较,请使用[[ .. ]](..)用于运行子库中的命令
  2. 请勿使用-eq进行字符串比较,请使用=
  3. 不要使用<进行数值的比较,使用-lt
  4. 要追加值,f2="$f2$i $f3"
  5. 要添加换行符,使用$'\n'外面的双引号,或者他们内部的文字换行。
  6. 你总是需要“$”字符串中的变量来引用它们,否则你会得到字符串。
  7. 在分配不能使用空格=左右
  8. 你不能在变量名前使用$在分配
  9. 做算术,使用$((..))result=$((var1+var2))
  10. 对于间接引用,如获取$4n=4,使用${!n}
  11. 为了防止分词删除你换行,双引号等变量echo "$line"

考虑编写较小的程序并在构建之前检查它们是否工作。

这里是我会写脚本(参数检查稍有欠缺):

#!/bin/bash 
addr=$(ifconfig -a | ./test) 
if [[ $1 = "DIR" ]] 
then 
    shift 
    (IFS=/; echo ssh "[email protected]$addr" mkdir -p "/var/www/media/$*";) 
elif [[ $1 = "F" ]] 
then 
    shift 
    last=$# 
    file=${!last} 
    (IFS=/; echo rsync "$file" "[email protected]$addr:/var/www/media/$*") 
else 
    echo "Unknown command '$1'" 
fi 

$*给您的第一个字符$IFS分隔的所有参数,而我使用的构建路径。这里的输出:

$ ./scriptname DIR a b c d 
ssh [email protected] mkdir -p /var/www/media/a/b/c/d 
$ ./scriptname F a b c d somefile.txt 
rsync somefile.txt [email protected]:/var/www/media/a/b/c/d/somefile.txt 

删除回声实际执行。

+0

谢谢先生。导致响应延迟的原因是b/c我试图做出高贵的事情并编辑我自己的脚本来工作,但我无法弄清楚ssh @ host << EOF应该如何在bash脚本中工作所以我跟你一起去了。我认为你的回应会帮助很多bash noobs寻找答案。 –

2

与脚本的主要问题是条件语句,如

if ($# -le "1") 

尽管这是什么会在其他语言一样,在猛砸这基本上等于在说,在子shell执行命令行$# -le "1",和使用其退出状态作为条件。

    你的情况
  • ,展开至3 -le "1",但命令3不存在,这将导致错误消息

    ./upload2:行3:3:命令未找到

最接近的有效语法将

if [ $# -le 1 ] 

这是主要问题,还有其他问题在that other guy's post中有详细说明和解决。

最后一件事,当您将值赋予变量时,例如

f3 = "[email protected]$addr:/var/www/media" 

不要在=周围留下空间。以上陈述将被解释为“以="[email protected]$addr:/var/www/media"作为参数运行命令f3”。