我对以下剪辑在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
我确定这是一个括号或引用问题,但我无法弄明白。
答案 0 :(得分:4)
您的command substitution $(...)
经历了word splitting和pathname 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数组中引用subshell命令:
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}