这个问题涉及到一个在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之间有什么区别?
- 应用程序为ripcheckc
我希望我的问题是有道理的。
编辑:已解决。
4条答案
按热度按时间gstyhher1#
我以前用过这个
bash
一行程序它将参数列表设置为当前参数列表,减去最后一个参数。
工作原理:
$#
是参数的数量$((...))
是一个算术表达式,因此$(($#-1))
比参数的数目小一。${variable:position:count}
是一个substring expression:从variable
中的位置开始提取count
个字符,在special case中,variable
为@
,表示参数列表,从position
开始的列表中提取count
参数,这里:对于第一个参数,position
是1
,count
比前面计算出的参数数小1。set -- arg1...argn
sets the argument list到给定参数所以最终结果是参数列表被一个新的列表替换,其中新的列表是除了最后一个参数之外的原始列表。
wgxvkvu92#
假设您已经有了一个
array
,您可以说:例如,如果脚本包含:
使用以下命令调用它:
bash scriptname foo bar baz
产生:wkyowqbh3#
也可以使用获取除最后一个参数外的所有参数
老实说,这有点粗略,因为它似乎是(ab),使用的是参数从1开始编号的事实,而不是0。
更新:这只适用于处理
$@
时的一个bug(最新在4.1.2中修复)。它适用于3.2版本。hm2xizp94#
将参数列表设置为第一个到倒数第二个,删除最后一个