在bash中剪切/回显

时间:2016-06-15 13:45:28

标签: bash echo cut

我对以下剪辑在bash脚本中的工作原理感到困惑。

if(confirm("Delete task?")) $scope.tasks.splice(this.$index, 1); 的示例:

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

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

More
random
spaces

我确定这是一个括号或引用问题,但我无法弄明白。

4 个答案:

答案 0 :(得分:4)

您的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>

答案 1 :(得分:1)

您需要在locations数组中引用subshel​​l命令:

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

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

答案 2 :(得分:0)

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

location=(More random spaces)

答案 3 :(得分:0)

您的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}