相关疑难解决方法(0)

$VAR vs ${VAR} 以及引用或不引用

我可以写

VAR=$VAR1
VAR=${VAR1}
VAR="$VAR1"
VAR="${VAR1}"
Run Code Online (Sandbox Code Playgroud)

最终结果对我来说似乎都差不多。我为什么要写一个或另一个?这些中的任何一个都不是便携式/ POSIX 吗?

shell shell-script environment-variables posix quoting

184
推荐指数
3
解决办法
8万
查看次数

在bash中有没有双引号有什么区别

我有一些 bash 脚本,其中一个包含以下内容:

#!/bin/bash
source $(dirname ${BASH_SOURCE[0]})/script.sh
Run Code Online (Sandbox Code Playgroud)

而另一个有以下内容:

#!/bin/bash
source "$(dirname ${BASH_SOURCE[0]})/script.sh"
Run Code Online (Sandbox Code Playgroud)

这些脚本的行为有何不同,为什么?什么区别?

shell bash quoting

9
推荐指数
2
解决办法
6448
查看次数

正确引用通过另一个命令间接传递的数组

我需要将文件名数组传递给命令,并保留正确的引用。到目前为止,一切都很好。不幸的是,该命令实际上是一个子命令,又被另一个命令调用。具体来说,命令是:

\n\n
git filter-branch --index-filter \\\n    \'git rm -rf --cached \xe2\x80\xb9file1\xe2\x80\xba \xe2\x80\xb9file2\xe2\x80\xba\xe2\x80\xa6\' \\\n    HEAD\n
Run Code Online (Sandbox Code Playgroud)\n\n

为简单起见,我\xe2\x80\x99m 将在下面用一个显示相同问题的更简单的命令替换它:

\n\n
printf \'%s\\n\' \'cmd file1 file2\xe2\x80\xa6\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在我\xe2\x80\x99已经得到了一个数组files=(\'a b\' c)。我想要的结果是上面的命令在一行中打印,并cmd根据需要单独引用后面的每个标记(例如,当存在\xe2\x80\x99s 空格时)。

\n\n

如果我手动扩展并引用文件名,它会起作用:

\n\n
$ printf \'%s\\n\' \'cmd \'\\\'\'a b\'\\\'\' c\'\n\xe2\x86\x92 cmd \'a b\' c\n
Run Code Online (Sandbox Code Playgroud)\n\n

(或者,我可以混合使用单引号和双引号来达到相同的结果。)

\n\n

但如果我尝试传递数组,它就不再起作用:

\n\n
    \n
  1. $ (set -x; printf \'%s\\n\' "cmd \'${files[@]}\'")\n+ printf \'%s\\n\' \'cmd \'\\\'\'a b\' \'c\'\\\'\'\'\n\xe2\x86\x92 cmd \'a b\nc\'\n
    Run Code Online (Sandbox Code Playgroud)
  2. \n
  3. $ (set -x; printf \'%s\\n\' \'cmd \'\\\'"${files[@]}"\\\')\n+ printf \'%s\\n\' …
    Run Code Online (Sandbox Code Playgroud)

bash array quoting arguments

4
推荐指数
1
解决办法
3175
查看次数