为什么函数的返回值会对该代码造成操作干扰



我编写了一小段代码来描述我的问题。

#!/bin/bash
function writeToFile(){
echo "$1" >> file.txt
}
function checkLetters(){
letters_array+=( $1 )
count=0
for letter in ${letters_array[*]}
do
if [[ "$1" == "$letter" ]]
then
count=$((count+1))  
fi
done
value=1
if [[ $count -eq $value ]] 
then                    
writeToFile "$1" 
fi
echo "return"
}
letters=( a b c d e )
for i in {1..2}
do
for letter in ${letters[*]}
do
checkLetters $letter
done
done
file="/mnt/file.txt"
while IFS= read -r line
do
printf "$linen"
done <"$file"
`> file.txt`

所以,若文件中并没有相同的字母,那个么代码就是在向文件中写入字母。若代码工作正常,文件中必须有字母a、b、c、d、e,若我使用如上所述的代码,则有。但我需要函数的返回值,所以我更改

checkLetters $letter

到此:

return_value=$(checkLetters $letter)

现在我的文件包含a、b、c、d、e、a、b。。。为什么?为什么返回值会导致这种情况,以及如何正确地实现这一点?

因为命令(在本例中为函数checkLetters(是在子shell中执行的,它继承了现有的letters_array,但只更新其本地副本。

形成bash(1(手册页面:

Bash通过在子shell环境中执行命令并用命令的标准输出替换命令替换来执行扩展,并删除任何尾随换行符。嵌入的换行符不会被删除,但在分词过程中可能会被删除。命令替换$(cat文件(可以替换为等效但更快的$(<文件(。

因此,如果您使用,也会发生完全相同的情况

( checkLetters $letter; )

示例:

arr=( )
function test() {
arr+=( $1 )
echo "in test ($1): ${arr[*]}"
}
test 1; test 2;
echo ${arr[*]}
echo "substitution: $(test 3)"
echo "After command substitution: ${arr[*]}"
( test 5; echo "in subshell: ${arr[*]}"; )
echo "after subshell: ${arr[*]}"

结果在:

in test (1): 1
in test (2): 1 2
1 2
substitution: in test (3): 1 2 3
After command substitution: 1 2
in test (5): 1 2 5
in subshell: 1 2 5
after subshell: 1 2

相关内容

最新更新