【问题标题】:ash: Remove last paramash:删除最后一个参数
【发布时间】:2018-06-09 10:06:38
【问题描述】:

我在一个只有 sh 和 ash 可用的 busybox 环境中。

现在我正在编写一个脚本,其中我需要将除最后一个参数之外的所有参数传递给 ln。

到目前为止,它看起来像这样:

#!/bin/ash
TARGET="/some/path/"

for last; do true; done

ln $@ $TARGET$last

显然,现在我将最后一个参数传递了两次,第一次未修改,然后在其前面使用 $TARGET 进行修改。

如何去掉 $@ 中的最后一个参数?

【问题讨论】:

  • 尝试在此处stackoverflow.com/questions/9057387/…修改此答案中的解决方案。
  • @namokarm echo "${@:2}" 只是切断了第一个参数的第一个字符,我该如何修改它以删除最后一个参数?
  • 我无法在 atm 尝试,但你可以试试这个 echo "${@:1:$#-1}"
  • @namokarm 这给了我“非法号码:17�-1”
  • 您尝试运行此 echo "${@:1:$#-1}" 还是作为脚本的一部分?

标签: shell sh busybox ash


【解决方案1】:

你可以试试这个方法

last_arg () {
shift $(($#-1))
echo "$@"
}
last=$(last_arg "$@")
echo "all but last = ${@%$last}"

【讨论】:

  • 这产生了奇怪的效果,对于某些参数列表,它会删除最后 2 个加上之前的参数的最后一个字符,而对于其他参数,它什么也没做。但这让我想到了一个可行的解决方案。
  • @Diskutant 给出了参数列表的样本,其中它剪切了最后一个字符,而另一个它什么也不做。
【解决方案2】:

现在有一个可行的解决方案,它不是那么好,它会改变参数,但在出现更好的解决方案之前,它会做到这一点。

for last; do true; done
while [[ "$1" != "$last" ]] ; do
    args="$args $1"
    shift
done

echo $args

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-21
    • 2020-12-31
    • 2013-12-22
    • 1970-01-01
    • 2022-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多