我是bash编程的新手,想要创建一个脚本,将每个find的结果单独存储到一个数组中。现在我希望command
变量扩展到语句MYRA=($(${Command} $1))
Command = 'find . -iname "*.cpp" -o -iname "*.h"'
declare -a MYRA
MYRA=($(${Command} $1))
echo ${#MYRA[@]}
然而,当我尝试这个脚本时,我得到了结果
$ sh script.sh
script.sh: line 1: Command: command not found
0
有关如何解决此问题的任何建议?
答案 0 :(得分:3)
Shell赋值语句在=
周围可能没有空格。这是有效的:
Command='some command'
这不是:
Command = 'some command'
在第二种形式中,bash会将Command
解释为命令名。
答案 1 :(得分:1)
以下所有内容都需要#!/bin/bash
shebang(因为您使用的是阵列,这只是一个仅限bash的功能,因此不会让您感到惊讶。)
另外,请参阅http://mywiki.wooledge.org/BashFAQ/050进行全面讨论。
最佳实践实现看起来像这样:
# commands should be encapsulated in functions where possible
find_sources() { find . '(' -iname '*.cpp' -o -iname '*.h' ')' -print0; }
declare -a source_files
while IFS= read -r -d '' filename; do
source_files+=( "filename" )
done < <(find_sources)
现在,如果你真的需要将命令存储在一个数组中(也许你正在动态构建它),那么这样做 this :
# store literal argv for find command in array
# ...if you wanted to build this up dynamically, you could do so.
find_command=( find . '(' -iname '*.cpp' -o -iname '*.h' ')' -print0 )
declare -a source_files
while IFS= read -r -d '' filename; do
source_files+=( "filename" )
done < <("${find_command[@]}")