Shell脚本中如何正确使用cut命令从字符串获取预期输出?
问题根源
原来的for i in $list没有用引号包裹$list,Bash会默认按空格、换行、制表符拆分字符串,导致"do not target"被拆成多个独立的循环项,最终输出零散的单词。
解决方法
方法1:临时修改IFS,只按换行分割循环项
通过修改环境变量IFS(内部字段分隔符)为换行符,让循环仅按行处理列表中的每一项,避免空格拆分:
#!/bin/bash list="john,do not target martin,unknown" # 临时设置IFS为换行,仅按行分割 IFS=$'\n' for i in $list; do # 用cut提取逗号后的字段,注意echo要加引号保留空格 value=$(echo "$i" | cut -f2 -d',') echo "$value" done # 恢复默认IFS(可选,养成良好习惯) unset IFS
方法2:用while read直接拆分字段(更高效)
利用read命令结合IFS=,,直接将每行按逗号拆分成name和value,无需额外调用cut:
#!/bin/bash list="john,do not target martin,unknown" echo "$list" | while IFS=, read -r name value; do echo "$value" done
-r选项用于避免read解析转义字符,保证原始字符串的完整性。
方法3:用awk一键处理
借助awk指定逗号为分隔符,直接打印每行的第二个字段,代码更简洁:
#!/bin/bash list="john,do not target martin,unknown" echo "$list" | awk -F',' '{print $2}'
内容的提问来源于stack exchange,提问作者Saravana Kumar
相关产品推荐
相关产品推荐

