有人可以用这段代码解释我
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
并给我这个错误:没有这样的文件或目录?
为什么=和引号之间的空格会产生这个错误?
答案 0 :(得分:7)
Shell允许您通过在命令前添加一个或多个变量赋值来提供每命令环境覆盖。
name= "/home/cft/"$data"_test.tar"
要求shell运行名为/home/cft/2013-10-08S12:00:00_test.tar
的程序(例如),其值name
设置为其环境中的空字符串。
(在您的情况下,发生错误是因为命名的tar文件不存在,或者如果不存在,则不是可执行文件。)
通过在等号后面没有空格来识别变量赋值。
(name = whatever
当然只是一个名为name
的命令,带有两个字符串参数=
和whatever
。)
答案 1 :(得分:4)
等号和定义之间不能有空格。
http://www.tldp.org/LDP/abs/html/varassignment.html
这背后没有理论。这只是语言设计者做出的决定,也是解析器强制执行的决定。
答案 2 :(得分: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了解变量是$data
而不是$data_backup
:
name="/home/cft/${data}_test.tar"