我有,
my.sh
while IFS= read -r line ; do
v1="$line";
t1=`echo $line | awk -F= '{print $2}'`
echo "$t1"
done < $1
样本.txt
say=hello
test=0 0/15 * * * ?
logs=valuelogs
输出 :
[root@centos gen]# ./my.sh test.txt
hello
0 0/15 hello.txt 2.txt tmp.log my.sh sample.txt test.sh test.txt hello.txt
2.txt tmp.log my.sh sample.txt test.sh test.txt hello.txt 2.txt tmp.log
my.sh sample.txt test.sh test.txt ?
valuelogs
在这里,由于执行了诸如echo *
& 之类的命令,我们得到了错误的输出,它给出了当前目录上的文件列表作为输出。
有没有同样的替代解决方案?
答案1
问题出在echo $line
后面的引号里面。双引号变量以防止通配符扩展:
t1=`echo "$line" | awk -F= '{print $2}'`
答案2
您可以将 shell 脚本重写为
awk -F= '{print $2}' "$1"
并完全避免所有 shell 处理(除了这里的单引号和$1
您想要的参数扩展);甚至作为 AWK 脚本
#!/usr/bin/awk -f
BEGIN { FS="=" }
{ print $2 }