我正在编写一些备份脚本,目标路径很长。我可以定义这样的内容吗?
TARGET='/media/user/externaldrive/folder with spaces/blahblah'
然后像这样将其用作路径的一部分?
cp file.txt '$TARGET/some folder with spaces/file.txt'
只能为此脚本定义变量。
正确的做法是什么?因为这就是我得到的:
cp: cannot create regular file ‘$TARGET/some folder with spaces/file.txt’: No such file or directory
答案1
变量分配是正确的,但是在使用该变量的命令中存在语法错误:
您需要输入的是:
cp file.txt "${TARGET}/some folder with spaces/file.txt"
cp file.txt "$TARGET/some folder with spaces/file.txt"
注意二变化:
使用双引号
"..."
而不是单引号'...'
,因为双引号允许 bash 变量扩展,而单引号禁止扩展并保持字符串原样。由于变量直接嵌入路径字符串中,并且变量名称前后没有空格,因此我们需要${variable}
而不是仅仅$variable
在这里。花括号告诉 bash 变量名称的确切结束位置,否则这将不清楚。花括号并没有错,但在这种情况下也不是必需的,因为变量名后面的下一个字符是
/
,这在名称本身中是不允许的,因此将名称与字符串的其余部分分开。
谢谢@heemayl的回答来纠正这个问题!
答案2
在设置变量名称时有一定的规则bash
:
Vaiables 的名称只能包含来自
[[:alnum:]_]
ieA-Z
、、a-z
和0-9
的字符_
。变量名不能以数字开头
因此,在获取变量的值时,除非变量后面有以下任何字符,否则无需{}
包装变量的名称:
$ 1foo=bar
1foo=bar: command not found
$ foo1=bar
$ echo "$foo1"
bar
$ echo "$foo12"
$ echo "${foo1}2"
bar2
$ echo "$foo1_"
$ echo "${foo1}_"
bar_
就你的情况而言:
使用时删除单引号并添加双引号
cp
,单引号内的所有内容均按字面意思理解,因此变量不会扩展双引号是必要的,因为文件路径中有空格,所以如果你不使用引号,则在使用时会出现单词分割的情况
cp
在获取值时,
$TARGET
后面跟着的/
不是有效的变量名组成字符,所以{}
不是必需的$ TARGET='/media/user/externaldrive/folder with spaces/blahblah' $ echo '$TARGET' $TARGET $ echo '$TARGET/some folder with spaces/file.txt' $TARGET/some folder with spaces/file.txt $ echo "$TARGET/some folder with spaces/file.txt" /media/user/externaldrive/folder with spaces/blahblah/some folder with spaces/file.txt
答案3
简短回答:是的!您 100% 正确。不过,如果您想让其他脚本可以使用该变量,请不要忘记运行export TARGET
。