【问题标题】:Cut / echo inside bash [duplicate]在 bash 中剪切/回显 [重复]
【发布时间】:2016-10-16 16:17:13
【问题描述】:

我对以下剪切在 bash 脚本中的工作方式感到困惑。

file.csv 的示例:

#10.10.10.10;28;9.10.10.10: up;Something ;More random spaces

我的脚本:

#!/bin/bash

csv_file="file.csv"

locations=( $( cut -d';' -f5 $csv_file ) )

for ((i=0; i < ${#locations[@]}; i++))
do
   echo "${locations[$i]}"
done

脚本的结果是:

More
random
spaces

当我只是在我的 CLI 中复制并粘贴剪切而没有任何回声或变量时,剪切按我的预期工作并打印:

More random spaces

我确定是括号或引号问题,但我就是想不通。

【问题讨论】:

  • 如果你想要整个字符串,为什么要将它保存到数组中?

标签: bash echo cut


【解决方案1】:

你的command substitution $(...)经历word splittingpathname expansion

a="hello world"
arr=($(echo "$a")); # Bad example, as it could have been: arr=($a)

echo "${arr[0]}" # hello
echo "${arr[1]}" # world

您可以通过将命令替换用双引号括起来来防止这种情况:

arr=( "$(...)" )
echo "${arr[0]}" # hello world

同样适用于parameter expansions,例如:

a="hello world"
printf "<%s>" $a   # <hello><world>
printf "<%s>" "$a" # <hello world>

【讨论】:

    【解决方案2】:

    需要在位置数组中引用子shell命令:

    locations=( "$( cut -d';' -f5 $csv_file )" )
    

    更多关于“带空格的数组”的信息:BASH array with spaces in elements

    【讨论】:

      【解决方案3】:

      以下语句创建一个包含三个元素的数组:

      location=(More random spaces)
      

      【讨论】:

        【解决方案4】:

        您的cut 命令给出了字符串More random spaces,当您将其转换为数组时,它有3 个字段。

        你可以把你的脚本改成

        cut -d";" -f5 < ${csv_file}
        

        当你想对每一行输出做更多的事情时,你有更多的控制权

        csv_file="file.csv"
        
        while IFS=";" read -r f1 f2 f3 f4 f5 f6_and_higher; do
           # Ignore fields f1 f2 f3 and f4
           echo "${f5}"
        done < ${csv_file}
        

        或者(更好)你可以避免while循环

        awk -F ";" '{print $5}' ${csv_file}
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-07-03
          • 1970-01-01
          • 2022-01-26
          • 1970-01-01
          • 2016-02-16
          • 2021-09-11
          • 2017-07-09
          • 2023-04-05
          相关资源
          最近更新 更多