我可以写
VAR=$VAR1
VAR=${VAR1}
VAR="$VAR1"
VAR="${VAR1}"
Run Code Online (Sandbox Code Playgroud)
最终结果对我来说似乎都差不多。我为什么要写一个或另一个?这些中的任何一个都不是便携式/ POSIX 吗?
我有一些 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)
这些脚本的行为有何不同,为什么?什么是区别?
我需要将文件名数组传递给命令,并保留正确的引用。到目前为止,一切都很好。不幸的是,该命令实际上是一个子命令,又被另一个命令调用。具体来说,命令是:
\n\ngit 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\nRun Code Online (Sandbox Code Playgroud)\n\n为简单起见,我\xe2\x80\x99m 将在下面用一个显示相同问题的更简单的命令替换它:
\n\nprintf \'%s\\n\' \'cmd file1 file2\xe2\x80\xa6\'\nRun Code Online (Sandbox Code Playgroud)\n\n现在我\xe2\x80\x99已经得到了一个数组files=(\'a b\' c)。我想要的结果是上面的命令在一行中打印,并cmd根据需要单独引用后面的每个标记(例如,当存在\xe2\x80\x99s 空格时)。
如果我手动扩展并引用文件名,它会起作用:
\n\n$ printf \'%s\\n\' \'cmd \'\\\'\'a b\'\\\'\' c\'\n\xe2\x86\x92 cmd \'a b\' c\nRun Code Online (Sandbox Code Playgroud)\n\n(或者,我可以混合使用单引号和双引号来达到相同的结果。)
\n\n但如果我尝试传递数组,它就不再起作用:
\n\n$ (set -x; printf \'%s\\n\' "cmd \'${files[@]}\'")\n+ printf \'%s\\n\' \'cmd \'\\\'\'a b\' \'c\'\\\'\'\'\n\xe2\x86\x92 cmd \'a b\nc\'\nRun Code Online (Sandbox Code Playgroud)$ (set -x; printf \'%s\\n\' \'cmd \'\\\'"${files[@]}"\\\')\n+ printf \'%s\\n\' …Run Code Online (Sandbox Code Playgroud)