Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash参数数组操作问题_Bash - Fatal编程技术网

Bash参数数组操作问题

Bash参数数组操作问题,bash,Bash,我的第一个bash脚本有问题。我在for循环中填充一个数组,当我试图从中获取一个项目时,我总是获取第一个元素 for (( i = 0; i < ${#*}; i++ )); do hash=$(md5 -q ${@:$i:1}) modifiedNames[$i]=${@:$i:1}$hash done echo ${modifiedNames[1]} ((i=0;i那样调用脚本,则: ${@} = array( [0] = ./script, [1] = file1,

我的第一个bash脚本有问题。我在for循环中填充一个数组,当我试图从中获取一个项目时,我总是获取第一个元素

for (( i = 0; i < ${#*}; i++ )); do
hash=$(md5 -q ${@:$i:1})
modifiedNames[$i]=${@:$i:1}$hash 
done

echo ${modifiedNames[1]}
((i=0;i<${#*};i++)的
;做
hash=$(md5-q${@:$i:1})
modifiedNames[$i]=${@:$i:1}$hash
完成
echo${modifiedNames[1]}
例如,如果我这样调用我的脚本:./script.sh file1 file2我得到file1[file1hash]

提前谢谢

实际上,您得到的是第二个元素,但是您的循环在[0]和[1]中放置了相同的值

我不确定您想做什么,但是迭代参数,然后为数组保留一个单独的计数器可能会更容易

n=0
for i in "$@"; do
  . . .
  n=$(($n + 1))
done

我认为您的循环行为很有趣,因为它应该以I=1开始,然后转到I=${#*}。${@:0:1}的扩展将提供file1,${@:1:1}也是如此


尝试
for((i=1;i您正在迭代从0开始的参数数组,这是命令名。因此,如果您像
/script.sh file1 file2>那样调用脚本,则:

${@} = array(
   [0] = ./script,
   [1] = file1,
   [2] = file2
)
因此,您将获得:

modifiedNamed = array(
   [0] = md5(./script),
   [1] = md5(file1)
)
您应该将
for
循环索引更改为:

for (( i = 1; i <= ${#*}; i++ )); do

for((i=1;i
$@
不是一个真正的数组-它是一个shell“特殊参数”,您需要比其他数组更小心地使用它

您看到这种行为的原因是
${parameter:length:offset}
语法的确切行为在
parameter
@
时是特殊情况,并且这种行为与
@
为真实数组时的行为不一致

以下是相关文档(boldemphasis):

${
参数
偏移量
长度
}

…如果参数为@,则结果为从偏移开始的长度位置参数。如果参数为@,则结果为从偏移开始的长度位置参数

位置参数
$0
$1
$2
,…,因此使用这种语法,它的行为就好像
$@
包含脚本名称(
$0
)以及脚本的参数(
$1
$2
,…)。这与
“$”不一致
扩展到
“$1”“$2”…
,但这就是生活

您应该能够通过创建一个新数组而不是直接使用
$@
来简化事情(并修复脚本)

new_array=("$@")
for (( i = 0; i < ${#new_array}; i++ )); do
    hash=$(md5 -q ${new_array[@]:$i:1})
    modifiedNames[$i]=${new_array[@]:$i:1}$hash 
done

echo ${modifiedNames[1]}
new_数组=(“$@”)
对于((i=0;i<${{new#u array};i++),do
hash=$(md5-q${new_数组[@]:$i:1})
modifiedNames[$i]=${new\u数组[@]:$i:1}$hash
完成
echo${modifiedNames[1]}

Ok,但为什么循环的行为如此?我看不出它将相同的值放入数组项的原因。