我正在尝试迭代文件名数组并替换绝对路径内的文件名。代码是,
#!/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
就像你告诉的那样。array
string
如果你想为每个元素添加前缀和后缀,你可以这样做:
$ 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