删除bash变量中的最后一个单词

时间:2014-05-13 14:53:23

标签: bash

我有类似的东西:

...
args=$*
echo $args
...

结果是

unusable1 unusable2 useful useful ... useful unusable3

我需要删除所有“无法使用”的args。他们总是在第一,第二和最后的位置。 经过一番调查后,我找到了${*:3} bash语法。它有助于删除前两个。

...
args=${*:3}
echo $args
...

结果是

useful useful ... useful unusable3

但我找不到如何使用相同的语法删除最后一个单词。

6 个答案:

答案 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变量中的有趣参数。