#!/bin/ksh
Temp=Kerala
cs1=`grep "$Temp" State_list.txt | awk '{print $NF}'`
echo $cs1 #("Not seeing output KL":
如果我按如下方式更改代码,它就会起作用:
cs1=`grep "Kerala" State_list.txt | awk '{print $NF}'`
...但我想将它作为变量传递。
文件State_List.txt如下:
Karnataka KAR
TamilNadu TN
Kerala KL
答案1
这个问题在评论区已经解决了。
概括:
这些文件(包括脚本文件和可能的数据文件)都是 DOS 文本文件。在 Unix 上,这意味着\r
每行末尾有一个多余的(回车符)。
对于脚本来说,这意味着变量赋值
Temp=Kerala
将值赋给Kerala\r
变量Temp
。由于数据文件不包含该值,因此从未找到它。
使用插入的值代替变量来运行脚本是有效的,因为它在数据中的该位置不受 DOS 文本问题的影响。
应在这两个文件上安装并运行该实用程序dos2unix
,以确保它们是 Unix 文本文件。也可以看看本网站的其他问题与此实用程序相关。
该脚本也可以这样写:
#!/bin/sh
Temp='Kerala'
cs1=$( awk -v pattern="$Temp" '$1 ~ pattern { print $NF }' State_list.txt )
printf '%s\n' "$cs1"
这摆脱了grep
并awk
在其位置使用来扫描数据内文件第一列中包含(在命令行上pattern
分配的变量)的任何行。$Temp
使用==
in place~
执行精确字符串匹配,而不是正则表达式匹配。
该脚本是一个sh
脚本,因为它(和原始脚本)没有使用任何特殊ksh
功能。