我正在编写一个旨在在各种计算机上运行的shell脚本。其中一些机器有bash 2或bash 3.有些正在运行BusyBox 1.18.4,其中bin/bash
存在,但
/bin/bash --version
根本不会返回任何内容foo=( "hello" "world" )
抱怨意外"("
附近的语法错误,无论是否在parens内部都有额外的空格...所以数组似乎有限或缺失还有更现代或更全功能的Linux和bash版本。
bash脚本在运行时为调用某些实用程序(如find
)构建参数的最便携方式是什么?我可以建立一个字符串,但觉得数组是一个更好的选择。除了上面第二个要点......
我们说我的脚本是foo
,您可以这样称呼它:foo -o 1 .jpg .png
这里有一些伪代码
#!/bin/bash
# handle option -o here
shift $(expr $OPTIND - 1)
# build up parameters for find here
parameters=(my-diretory -type f -maxdepth 2)
if [ -n "$1" ]; then
parameters+=-iname '*$1' -print
shift
fi
while [ $# -gt 0 ]; do
parameters+=-o -iname '*$1' -print
shift
done
find <new positional parameters here> | some-while-loop
答案 0 :(得分:7)
如果您需要使用大多数POSIX sh,例如busybox ash-named-bash中可用,您可以直接使用set
$ set -- hello
$ set -- "$@" world
$ printf '%s\n' "$@"
hello
world
更简单的例子:
$ set -- /etc -name '*b*'
$ set -- "$@" -type l -exec readlink {} +
$ find "$@"
/proc/mounts
答案 1 :(得分:2)
虽然您的问题不仅仅涉及Bash,但您可以阅读有关该主题的Wooledge Bash常见问题解答:
http://mywiki.wooledge.org/BashFAQ/050
它提到了使用&#34; set - &#34;对于较旧的炮弹,还提供了大量的背景资料。在构建参数列表时,很容易创建一个在简单情况下工作但在数据具有特殊字符时失败的系统,因此阅读该主题可能是值得的。