Shell脚本给出看似错误的退出信息

时间:2018-03-25 23:41:26

标签: shell unix scripting

当我以文件夹作为参数运行此脚本时,我收到此错误:

  

lab9.sh:1:eval:语法错误:“(”意外

但这怎么可能呢?我的第1行没有左括号。我认为问题是我的shebang,但你可以看到它处于完美的状态。我脚本中的其他所有内容似乎都是有序的。

#!/bin/bash

file=$1
firstPart='tar -cvf n00866097_Backup('
date='`date +%Y-%m-%d`'
lastPart=').tgz $file'
zippedFile=$firstPart$date$lastPart

eval $zippedFile

pscp -pw password $zippedFile user@192.168.100.80:[test]/

3 个答案:

答案 0 :(得分:1)

您需要引用包含()文字的文件名。您可以使用$()执行date命令。并且不要将zipFile与创建它的命令混淆,否则您的pscp将无效。像,

file="$1"
zippedFile="n00866097_Backup($(date +%Y-%m-%d)).tgz"
cmd="tar -cvf \"$zippedFile\" \"$file\""
eval "$cmd"

答案 1 :(得分:0)

除了eval之外,不需要$date或变量:

date=$(date +%Y-%m-%d)
tar -cvf n00866097_Backup\(${date}\).tgz $1

pscp -pw password \
   tar -cvf n00866097_Backup\(${date}\).tgz $1 \
      user@192.168.100.80:[test]/

答案 2 :(得分:0)

当然shell的错误信息是正确的。在您的脚本中,shell被调用两次。首先,通过运行./lab9.sh之类的东西来启动脚本时调用它。在执行此脚本期间,eval在执行

时会触发另一个shell的启动
eval $zippedFile

在这个上下文中,这个新启动的shell应该执行语句

tar -cvf n00866097_Backup(`date +%Y-%m-%d`).tgz

对于这个新shell,这个语句是第一个,所以它的行号是1.但是()对shell有特殊含义它在语法上是错误的放置他们在这里,所以提出了一个错误。如果你想将它们作为文件名的一部分,你必须逃避它们。但是检查其他答案,在这里使用eval并不是一个好主意。