我自己用于长路径的变量

我自己用于长路径的变量

我正在编写一些备份脚本,目标路径很长。我可以定义这样的内容吗?

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:]_]ie A-Z、、a-z0-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

相关内容