我有像这样的格式的csv
John|Mayer
Bill|Potter
...
脚本是:
cat names.csv | while read line
do
name=$( echo $line | cut -d'|' -f1 ) # get the first name
surname=$( echo $line | cut -d'|' -f2 ) # get the surname
echo "$surname"
echo "Your name is: $name and surname is: $surname"
done
姓氏回声正在起作用,我得到名单(Mayer Potter ......)。 但是当我在其他一些环境中使用它作为变量时它不起作用(并且姓氏是:$ surname“)
答案 0 :(得分:0)
这是因为在bash命令中,arround管道|
在子进程中执行,
所以在done
当前shell环境与命令之前相同
见:
declare -p BASHPID
declare -p BASHPID >&2 | declare -p BASHPID >&2
这可以使用输入重定向而不是cat |
while read line
do
...
done < names.csv
它也避免了产生两个进程并创建一个管道
答案 1 :(得分:0)
将我的评论转换为答案。
你的循环中几乎没有问题:
cat
和管道,因为它会分叉子壳cut
IFS
两次
醇>
你可以使用这个循环:
while IFS='|' read -r fname lname; do
declare -p fname lname
# or do processing with $fname, $lname here
done < names.csv