在Bash脚本中将串联字符串作为命令运行

时间:2019-04-24 16:24:45

标签: bash variables

我正在尝试计算/foo/中具有不同扩展名的文件的数量。 情况1 可以正常工作,但是更灵活的情况(例如情况2 情况3 )不能正常工作。

文件test.sh

# case 1
vista=$(find /foo/*.zip -atime -1)
echo "$vista" | wc -l

# case 2
vista=$(find /foo/*)

echo "$vista.zip -atime -1" | wc -l

# case 3
echo "$vista.xz -atime -1" | wc -l

输出:

./test.sh 
187
4566
4566

我怀疑问题是,例如案例2 中的echo "$vista.zip -atime -1"先运行find /foo/*,然后再附加字符串zip -atime -1,但我不知道如何正确地做。

1 个答案:

答案 0 :(得分:1)

永远不要将代码存储在字符串中(除非使用printf %q生成eval安全版本的变量,然后在运行时使用eval)。使用数组(用于动态构造的内容)或函数。

前者:

find_cmd=( find /foo/* )
"${find_cmd[@]}" -atime -1 | wc -l

后者:

find_under_foo() { find /foo/* "$@"; }
find_under_foo -atime -1 | wc -l