从shell脚本的参数列表中删除最后一个参数(bash)

jc3wubiy  于 2023-01-17  发布在  Shell
关注(0)|答案(4)|浏览(309)

这个问题涉及到一个在automator osx中运行的bash脚本,我使用automator操作从finder中获取并过滤一堆文件引用,然后在列表中添加父文件夹的名称。也是通过一个自动机动作。自动机然后把这些参数馈送给一个叫做“运行shell脚本”的动作。我不确定automator是如何调用脚本的,但是参数列表看起来像这样:echo "$@"
/卷/全球Raid/联机/WAV_TEST/测试手册50/01/01000 43 - 001.wav/卷/全球Raid/联机/WAV_TEST/测试手册50/02/02000 43 - 002.wav/卷/全球Raid/联机/WAV_TEST/测试手册50/03/03000 43 - 003.wav/卷/全球Raid/联机/WAV_TEST/测试手册50
在本例中,路径为3个文件和一个文件夹。
在shell脚本中,我启动了一个名为ripcheckc* 的应用程序,其中从automator传递的参数减去列表中的最后一个参数(文件夹)。
我用这个来删除最后一个参数:

_args=( "$@" )
unset _args[${#_args[@]}-1]

这是echo $_args
/卷/全球Raid/联机/WAV_TEST/测试手册50/01/01000 43 - 001.wav/卷/全球Raid/联机/WAV_TEST/测试手册50/02/02000 43 - 002.wav/卷/全球Raid/联机/WAV_TEST/测试手册50/03/03000 43-003.wav
和以前一样,只是没有文件夹。
现在,如果我使用"$@"作为参数运行ripcheckc,它会工作(但稍后会失败,因为参数列表中的最后一个路径)如果我使用${_args[@]},应用程序将静默中止。当我回显$@_args时,除了最后一个参数外,输出看起来完全相同。
我的问题是-使第一个输入有效而第二个无效的$@和$_args之间有什么区别?

我希望我的问题是有道理的。
编辑:已解决。

gstyhher

gstyhher1#

我以前用过这个bash一行程序

set -- "${@:1:$(($#-1))}"

它将参数列表设置为当前参数列表,减去最后一个参数。
工作原理:

  • $#是参数的数量
  • $((...))是一个算术表达式,因此$(($#-1))比参数的数目小一。
  • ${variable:position:count}是一个substring expression:从variable中的位置开始提取count个字符,在special case中,variable@,表示参数列表,从position开始的列表中提取count参数,这里:对于第一个参数,position1count比前面计算出的参数数小1。
  • set -- arg1...argnsets the argument list到给定参数

所以最终结果是参数列表被一个新的列表替换,其中新的列表是除了最后一个参数之外的原始列表。

wgxvkvu9

wgxvkvu92#

假设您已经有了一个array,您可以说:

unset "array[${#array[@]}-1]"

例如,如果脚本包含:

array=( "$@" )
unset "array[${#array[@]}-1]"    # Removes last element -- also see: help unset
for i in "${array[@]}"; do
  echo "$i"
done

使用以下命令调用它:bash scriptname foo bar baz产生:

foo
bar
wkyowqbh

wkyowqbh3#

也可以使用获取除最后一个参数外的所有参数

"${@:0:$#}"

老实说,这有点粗略,因为它似乎是(ab),使用的是参数从1开始编号的事实,而不是0。
更新:这只适用于处理$@时的一个bug(最新在4.1.2中修复)。它适用于3.2版本。

hm2xizp9

hm2xizp94#

set -- "${@:1:$#-1}"

将参数列表设置为第一个到倒数第二个,删除最后一个

相关问题