我正在编写一个shell脚本,旨在在一系列机器上运行。其中一些机器具有bash 2或bash 3。有些正在运行BusyBox 1.18.4,其中
bin/bash
存在,但是:
/bin/bash --version
根本没有返回任何内容foo=("hello" "world")
会抱怨语法错误,附近意外的"("
,无论是否在括号内部加入额外的空格...所以数组似乎要么有限制要么缺失
还有更现代或功能更完整的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
set --
,那么原来传入的参数会被丢弃吗?我正在使用这些参数构建find
命令的参数... - user1011471"$@"
变量中可用。因此,如果您想添加更多的位置参数,您必须执行类似于set -- "$@" --more --more --more
的操作。明白了吗? - kojirofind
的内容,然后调用find
。但是这里"$@"
被同时使用了... - user1011471set --
放在一个函数内部,这样它只会丢弃函数的参数,而不是整个脚本的参数集合。 - Charles Duffyset -- "$@" 一些神奇的值
,然后进行处理和移位,直到我到达它。再移动一次,这就是传递给find
的内容。 - user1011471