替换字符串模式中的循环变量

替换字符串模式中的循环变量

我正在尝试迭代文件名数组并替换绝对路径内的文件名。代码是,

#!/bin/bash
jsArray=(moment.js datatable.js jquery.js jquery.tmpl.js dt_jq_ui.js report_app.js)
for f in "/path/to/res/${jsArray[@]}.js";
do
  echo "$f"
done

它返回,

/path/to/res/moment.js
datatable.js
jquery.js
jquery.tmpl.js
dt_jq_ui.js
report_app.js.js

为什么只有第一个元素有前缀,只有最后一个元素有后缀?

我期待这样的条目,

/path/to/res/moment.js
/path/to/res/datatable.js
..................
/path/to/res/report_app.js  

答案1

因为你告诉 Bash:

~$ echo "/path/to/res/${jsArray[@]}.js"
/path/to/res/moment.js datatable.js jquery.js jquery.tmpl.js dt_jq_ui.js report_app.js.js

你只是给出一根长绳子。你想做的是这样的

~$ for f in "${jsArray[@]}.js"
     do echo "/path/to/res/$f"
   done
/path/to/res/moment.js
/path/to/res/datatable.js
/path/to/res/jquery.js
/path/to/res/jquery.tmpl.js
/path/to/res/dt_jq_ui.js
/path/to/res/report_app.js.js

答案2

因为这就是你要给出的循环:

$ jsArray=(moment.js datatable.js jquery.js jquery.tmpl.js dt_jq_ui.js report_app.js)
$ echo "/path/to/res/${jsArray[@]}.js"
/path/to/res/moment.js datatable.js jquery.js jquery.tmpl.js dt_jq_ui.js report_app.js.js

或者,举一个更简单的例子:

$ arr=(a b c );
$ for f in "foo ${arr[@]} bar"; do echo "$f"; done
foo a
b
c bar

您给出一个字符串、一个数组和另一个字符串。为什么 shell 要将字符串附加到每个元素?我正在打印,,,string就像你告诉的那样。arraystring

如果你想为每个元素添加前缀和后缀,你可以这样做:

$ for f in "${jsArray[@]}";
do
  echo "/path/to/res/$f.js"
done
/path/to/res/moment.js.js
/path/to/res/datatable.js.js
/path/to/res/jquery.js.js
/path/to/res/jquery.tmpl.js.js
/path/to/res/dt_jq_ui.js.js
/path/to/res/report_app.js.js

相关内容