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

Ste*_*nov 4 bash

我有类似的东西:

...
args=$*
echo $args
...
Run Code Online (Sandbox Code Playgroud)

结果是

unusable1 unusable2 useful useful ... useful unusable3
Run Code Online (Sandbox Code Playgroud)

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

...
args=${*:3}
echo $args
...
Run Code Online (Sandbox Code Playgroud)

结果是

useful useful ... useful unusable3
Run Code Online (Sandbox Code Playgroud)

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

anu*_*ava 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
Run Code Online (Sandbox Code Playgroud)


Cha*_*ffy 4

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[@]}"
Run Code Online (Sandbox Code Playgroud)

运行上面的命令会产生以下输出:

<third argument>
<fourth argument>
Run Code Online (Sandbox Code Playgroud)

...并且,通过这样做,可以证明它可以正确地将参数保持在一起,即使它们包含空格或通配符也是如此。


对于 shell 完成脚本,您还可以考虑:

printf '%q ' "${args[@]}"
Run Code Online (Sandbox Code Playgroud)

...以可由 shell 评估的方式引用内容。