我创建了当前目录中以.cpp结尾的所有文件的名称数组,并希望创建相同的数组,并将.cpp替换为.o
cppfield=$(ls *.cpp)
ofield=$(ls *.cpp | awk '{print}' ORS=' ' | sed s/.cpp/.o/g)
但是只有.cpp与.o
切换的第一个参数不起作用答案 0 :(得分:2)
展开数组时可以使用模式替换:
bash> a=(a.cpp b.cpp);
bash> a=("${a[@]/%.cpp/.o}");
bash> echo "${a[@]}";
a.o b.o
答案 1 :(得分:2)
这是你想要做的。
$ ls
a1.cpp a2.cpp a3.cpp a4.cpp a5.cpp a6.cpp
$ cppfield=(*.cpp)
$ declare -p cppfield
declare -a cppfield='([0]="a1.cpp" [1]="a2.cpp" [2]="a3.cpp" [3]="a4.cpp" [4]="a5.cpp" [5]="a6.cpp")'
$ ofield=("${cppfield[@]/%.cpp/.o}")
$ declare -p ofield
declare -a ofield='([0]="a1.o" [1]="a2.o" [2]="a3.o" [3]="a4.o" [4]="a5.o" [5]="a6.o")'
使用globbing填充数组以安全地处理文件名。 Don't parse ls
使用Shell Parameter Expansion将.cpp
替换为每个数组元素上的.o
。
在引号中展开数组并将结果存储在新数组中。
答案 2 :(得分:0)
请勿使用ls
获取目录内容以供进一步处理。很难处理正确包含空格和换行符的文件名。
最好像这样使用find
:
x() { sed 's/\.cpp$/.o/' <<< "$1"; }
export -f x
find . -maxdepth 1 -exec bash -c 'x "{}"' \;
现在答案不再是关于数组了,但那是因为我想指出将ls
的输出存储在数组中已经是问题的开始。也许完全避免这个任务的数组。