1

有人可以用这段代码解释我吗

 data=$(date +"%Y-%m-%dS%H:%M:%S")
 name="/home/cft/"$data"_test.tar"
 touch $name

工作,创建一个新的 .tar 文件,但此代码不起作用

 data=$(date +"%Y-%m-%dS%H:%M:%S")
 name= "/home/cft/"$data"_test.tar"
 touch $name

并给我这个错误:没有这样的文件或目录?

为什么 = 和引号之间的空格会产生此错误?

4

3 回答 3

7

Shell 允许您通过在命令前加上一个或多个变量分配来提供每个命令的环境覆盖。

name= "/home/cft/"$data"_test.tar"

要求外壳程序运行名为/home/cft/2013-10-08S12:00:00_test.tar(例如)的程序,并将其值name设置为其环境中的空字符串。

(在您的情况下,发生错误是因为命名的 tar 文件不存在,或者如果存在,则不是可执行文件。)

变量赋值通过等号后没有空格来标识。

(name = whatever当然,只是一个name使用两个字符串参数调用的命令,=并且whatever.)

于 2013-10-08T15:22:36.143 回答
4

等号和定义之间不能有空格。

http://www.tldp.org/LDP/abs/html/varassignment.html

这背后没有理论。这只是语言设计者做出的决定,解析器会强制执行。

于 2013-10-08T15:16:00.587 回答
2

在 BASH(以及其他 Bourne 类型的 shell,如 zsh 和 Kornshell)中,设置变量时等号周围不能有空格。

好的:

$ foo="bar"

坏的:

$ foo= "bar"
$ foo = "bar"

没有真正的理由会阻止使用空间。其他编程语言对此没有任何问题。这只是 shell 本身的语法。

原因可能与原始 Bourne shell 解析有关,其中 shell 会根据空格分解命令行。这将使foo=bar单个参数而不是两个或三个参数(取决于您是否在两侧都有空格或只有等号的一侧)。shell 可以看到这个=符号,并且知道这个参数是一个赋值。

shell 参数解析在很多方面都非常原始。空白非常重要。外壳必须小而快才能响应。这意味着剥离不必要的东西,比如复杂的行解析。

引号我相信你的意思是引号。双引号用于覆盖空格上的参数中断:

坏的:

$ foo=this is a test
bash: is: command not found

好的:

$ foo="this is a test"

双引号允许插值。单引号不:

$ foo="bar"
$ echo "The value of foo is $foo"
The value of foo is bar
$ echo 'The value of foo is $foo'
The value of foo is $foo.

如果你从单引号开始,你可以在里面放双引号。如果你有单引号,你可以在里面放双引号。

$ foo="bar"
$ echo "The value of foo is '$foo'"
The value of foo is 'bar'
$ echo 'The value of foo is "$foo"'
The value of foo is "$foo"

这意味着您不必取消引用 $data。但是,您必须在它周围加上花括号,因为下划线是变量名中的合法字符。因此,您要确保 shell 了解变量 is$data和 not $data_backup

name="/home/cft/${data}_test.tar"
于 2013-10-08T15:38:27.517 回答