下面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

10-06 03:32
查看更多