我有类似的东西:
...
args=$*
echo $args
...
结果是
unusable1 unusable2 useful useful ... useful unusable3
我需要删除所有“无法使用”的args。他们总是在第一,第二和最后的位置。
经过一番调查后,我找到了${*:3}
bash语法。它有助于删除前两个。
...
args=${*:3}
echo $args
...
结果是
useful useful ... useful unusable3
但我找不到如何使用相同的语法删除最后一个单词。
答案 0 :(得分:5)
您可以使用这样的函数/脚本打印除最后一个参数之外的所有参数:
func() {
echo "${@:1:$#-1}";
}
func aa bb cc dd ee
aa bb cc dd
func foo bar baz hello how are you
foo bar baz hello how are
答案 1 :(得分:3)
使用您的语法,您可以使用:
args=${*:3:$#-3}
说明:
${*:offset:length}
offset是3开始到第三个参数,length是参数个数减去3(两个第一个和最后一个)。
答案 2 :(得分:3)
args=${*:3}
会压缩你的参数列表。你不想这样做。请考虑遵循下面给出的模式:
# this next line sets "$@" for testing purposes; you don't need it in real life
set -- \
"first argument" \
"second argument" \
"third argument" \
"fourth argument" \
"fifth argument"
# trim the first two
args=( "${@:2}" )
# trim the last one
args=( "${args[@]:1:$(( ${#args[@]} - 2 ))}" )
# demonstrate the output content
printf '<%s>\n' "${args[@]}"
运行上述内容会产生以下输出:
<third argument>
<fourth argument>
...并且,通过这样做,证明它正确地将参数保持在一起,即使它们包含空格或通配符。
对于shell完成脚本,您可能还会考虑:
printf '%q ' "${args[@]}"
...引用内容的方式使得shell能够进行评估。
答案 3 :(得分:1)
您可以使用awk
:
args="unusable1 unusable2 useful useful ... useful unusable3"
args=$(awk '{$1=$2=$NF="";print}' <<< "$args")
echo "$args"
输出:
useful useful ... useful
该命令将第一个,第二个和最后一个($NF
)位置设置为空字符串。 NF
保存awk中的字段数。因此,$NF
是最后一栏。
答案 4 :(得分:0)
bash
并没有为数组提供这样的过滤方法。最好的选择是只使用一个循环并一次过滤一个。
for arg; do # Implicitly iterate over $@
[[ $arg =~ unusable ]] && continue
args+=( "$arg" )
done
答案 5 :(得分:-1)
试试这个:
args=$*
useful=${args#* }
useful=${useful#* }
useful=${useful% *}
然后你将获得$result
变量中的有趣参数。