Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.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,我有以下.txt文件: Marco 保罗 安东尼奥 我想逐行读取它,并为每一行分配一个.txt行值给一个变量。假设我的变量是$name,则流是: 从文件中读取第一行 分配$name=“马可” 使用$name 从文件中读取第二行 分配$name=“Paolo” 以下命令逐行读取作为参数传递的文件: while IFS= read -r line; do echo "Text read from file: $line" done < my_filename.txt 如果将上述内

我有以下.txt文件:

Marco
保罗
安东尼奥
我想逐行读取它,并为每一行分配一个.txt行值给一个变量。假设我的变量是
$name
,则流是:

  • 从文件中读取第一行
  • 分配
    $name
    =“马可”
  • 使用
    $name
  • 从文件中读取第二行
  • 分配
    $name
    =“Paolo”

    • 以下命令逐行读取作为参数传递的文件:

      while IFS= read -r line; do
          echo "Text read from file: $line"
      done < my_filename.txt
      
      如果将上述内容保存到文件名为
      readfile
      的脚本中,则可以按如下方式运行:

      chmod +x readfile
      ./readfile filename.txt
      
      如果文件不是(=未以换行符终止),则可以修改循环以处理尾随的部分行:

      while IFS= read -r line || [[ -n "$line" ]]; do
          echo "Text read from file: $line"
      done < "$1"
      

      (非Bash shell可能不知道
      read-u3
      ;使用
      read使用以下Bash模板应该允许您一次从文件中读取一个值并对其进行处理

      while read name; do
          # Do what you want to $name
      done < filename
      
      读取名称时;执行以下操作
      #做你想做的事$name
      完成<文件名
      
      我建议您使用
      -r
      标志来表示
      读取
      ,它代表:

      -r  Do not treat a backslash character in any special way. Consider each
          backslash to be part of the input line.
      
      我引用的是
      man1read

      另一件事是将文件名作为参数

      更新代码如下:

      #!/usr/bin/bash
      filename="$1"
      while read -r line; do
          name="$line"
          echo "Name read from file - $name"
      done < "$filename"
      
      !/usr/bin/bash
      filename=“$1”
      当读取-r行时;执行
      name=“$line”
      echo“从文件读取的名称-$Name”
      完成<“$filename”
      
      使用:


      如果您以不同的方式设置了
      IFS
      ,您将得到奇怪的结果。

      如果您需要处理输入文件和用户输入(或stdin中的任何其他内容),请使用以下解决方案:

      #! /bin/bash
      cat filename | while read LINE; do
          echo $LINE
      done
      
      #!/bin/bash
      exec 3<"$1"
      while IFS='' read -r -u 3 line || [[ -n "$line" ]]; do
          read -p "> $line (Press Enter to continue)"
      done
      
      !/bin/bash
      
      exec 3许多人发布了一个过度优化的解决方案。我不认为这是错误的,但我谦虚地认为,一个优化程度较低的解决方案将是可取的,以便让每个人都能轻松理解这是如何工作的。以下是我的建议:

      #!/bin/bash
      #
      # This program reads lines from a file.
      #
      
      end_of_file=0
      while [[ $end_of_file == 0 ]]; do
        read -r line
        # the last exit status is the 
        # flag of the end of file
        end_of_file=$?
        echo $line
      done < "$1"
      
      !/bin/bash
      #
      #这个程序从文件中读取行。
      #
      _文件的_结尾=0
      而[[$end\u of_file==0]];执行
      read-r行
      #最后一个退出状态是
      #文件结尾的标志
      _文件的_结尾=$?
      回音$线
      完成<“$1”
      
      正确处理错误:

      #!/bin/bash
      
      set -Ee    
      trap "echo error" EXIT    
      test -e ${FILENAME} || exit
      while read -r line
      do
          echo ${line}
      done < ${FILENAME}
      
      !/bin/bash
      set-Ee
      陷阱“回声错误”退出
      测试-e${FILENAME}| |退出
      而read-r行
      做
      echo${line}
      完成<${FILENAME}
      
      以下内容将打印出文件的内容:

      cat $Path/FileName.txt
      
      while read line;
      do
      echo $line     
      done
      
      在bash中使用IFS(内部字段分隔符)工具,定义用于将行分隔为标记的字符,默认情况下包括//

      步骤1:加载文件数据并插入列表:

      # declaring array list and index iterator
      declare -a array=()
      i=0
      
      # reading file in row mode, insert each line into array
      while IFS= read -r line; do
          array[i]=$line
          let "i++"
          # reading from file path
      done < "<yourFullFilePath>"
      
      数组中回声特定索引:访问数组中的变量:

      echo "${array[0]}"
      

      此方法有一个警告。如果while循环中的任何内容是交互式的(例如,从stdin读取),则它将从$1获取其输入。您将没有机会手动输入数据。值得注意的是,某些命令会中断(例如,它们会中断循环)这。例如,没有
      -n
      标志的
      ssh
      将有效地使您跳出循环。这可能是一个很好的原因,但我花了一段时间才确定是什么导致我的代码失败,然后才发现这一点。作为一行代码:IFS=''read-r line | |[[-n“$line”]];do echo“$line”;完成filename@OndraŽižka,这是由于
      ffmpeg
      使用stdin造成的。添加
      抱怨:建议使用
      .sh
      扩展。UNIX上的可执行文件通常根本没有扩展(您不运行
      ls.elf
      ),并且有一个bash shebang(以及仅使用bash的工具,如
      [[]]
      )一个表示POSIX sh兼容的扩展名在内部是矛盾的。除非您想在意识到它之前出现全局绑定问题,否则请不要使用它!这并不可怕,执行过程中没有中断。@MUYBelgium您是否尝试过在一行中包含单个
      *
      的文件?无论如何,这是一个反脚本tern.@OndraŽižka,
      read
      方法是。您在评论中提到的警告适用于循环运行命令(例如
      ffmpeg
      )从stdin读取的错误,通过使用非stdin FD进行循环或重定向此类命令的输入来解决。相比之下,解决
      for
      -循环方法中的全局错误意味着进行(然后需要反转)shell全局设置更改。@OndraŽižka,……此外,您在这里使用的
      for
      循环方法意味着在循环开始执行之前,必须读入所有内容,这使得即使禁用了全局绑定,如果在千兆字节的数据上循环,
      while read
      循环也不需要存储任何内容每次超过一行的数据,这意味着它可以在生成内容的子流程仍在运行时开始执行(因此可用于流式传输目的),并具有有限的内存消耗。从line@Thomas中间的空间会发生什么?提示:不想要的命令执行。这对我来说是有效的,与公认的答案相反。@ TranslucentCloud,如果它工作了,并且接受的回答没有,我怀疑你的shell是代码> SH < /COD。e> ,而不是
      bash
      ;在
      中使用的扩展测试命令
      公认答案中的语法是一种bashism。也就是说,这种语法实际上具有相关的含义:它会导致循环继续进行到输入文件的最后一行,即使它没有换行符。如果您想以符合POSIX的方式来做这件事,您应该使用
      |【-n“$line”]
      ,而不是
      [[
      。也就是说,这仍然需要修改,以便为
      读取设置
      IFS=
      ,以防止删除空白。作为一行:whilereadname;do echo${name};donecat $Path/FileName.txt while read line; do echo $line done
      # declaring array list and index iterator
      declare -a array=()
      i=0
      
      # reading file in row mode, insert each line into array
      while IFS= read -r line; do
          array[i]=$line
          let "i++"
          # reading from file path
      done < "<yourFullFilePath>"
      
      for line in "${array[@]}"
        do
          echo "$line"
        done
      
      echo "${array[0]}"