下面bash脚本的目标是读取csv文件(all_words.csv)并打印参数和值,但我有一个非常奇怪的问题。
当我运行脚本时,所有的单词参数(word1-word8
)都被打印出来了-直到现在一切都很好!当我想在函数之外打印为word1=$word1
时,出于某种原因,word1not get the value
?
为什么所有参数(word1-word8
)都在函数中打印值,而当我想在函数外部打印word1
时,则word1
没有值?
我试过export命令,但它没有帮助;export word1=$word1
请告诉我怎么做?有什么问题吗?
#!/bin/bash
read_csv ()
{
CSV_LINE=2
vars=()
c=1
while IFS=, read -ra arr; do
if ((c==1)); then
vars+=("${arr[@]}")
elif ((c==CSV_LINE)); then
for ((i=0; i<${#arr[@]}; i++)); do
declare ${vars[$i]}="${arr[$i]}"
done
fi
((c++))
done < all_words.CSV
echo CSV_LINE=$CSV_LINE
echo word1=$word1
echo word2=$word2
echo word3=$word3
echo word4=$word4
echo word5=$word5
echo word6=$word6
echo word7=$word7
echo word8=$word8
}
read_csv
echo word1=$word1
是的。
more all_words.CSV
word1,word2,word3,word4,word5,word6,word7,word8
&^#G TR /erfernfjer *&^NHY " "" ? / $@H,@Y^%" E "R$%*&*UJ,**U&^#%%@$^&// \\,^T%!#&^YG.+___KI*&HHTY,%%@$#!%^#&,P/\06E87*UHG11#
,edehu234#@!&,~hum&T%6e4
脚本输出示例:
./readWords_from_csv.bash
CSV_LINE=2
word1=&^#G TR / erfernfjer *&^NHY " "" ? / $@H
word2=@Y^%" E "R$%*&*UJ
word3=**U&^#%%@$^&//\\
word4=^T%!#&^YG.+___KI*&HHTY
word5=%%@$#!%^#&
word6=P/\06E87*UHG11#
word7=edehu234#@!&
word8=~hum&T%6e4
word1=
最佳答案
请建议…
更好地使用printf
:
printf -v "${vars[$i]}" "%s" "${arr[$i]}"
尽管我建议改用关联数组。这是更合适的解决方案:
#!/bin/bash
declare -A CSV_VALUES
declare -a CSV_KEYS
function read_csv {
CSV_VALUES=() CSV_KEYS=()
local VALUES I
{
IFS=, read -ra CSV_KEYS
IFS=, read -ra VALUES
} < all_words.csv
for I in "${!CSV_KEYS[@]}"; do
CSV_VALUES[${CSV_KEYS[I]}]=${VALUES[I]}
done
}
read_csv ## Perhaps pass the filename to read_csv as an argument instead?
# We can do for KEY in "${!CVS_VALUES[@]}" but the order is uncertain.
for KEY in "${CSV_KEYS[@]}"; do
echo "CSV_VALUES[$KEY]=${CSV_VALUES[$KEY]}"
done