我做了一个脚本,以便在不同情况下显示不同的内容。 脚本是:
#!/usr/bin/env bash
# declare an array, to store stuff in
declare -a myArray
shopt -s nocasematch
# read the full file into the array
# This while loop terminates when pressing CTRL-D
i=1
while read -r line; do
myArray[i]="${line}"
((i++))
done < /dev/stdin
# Process the array
for ((j=1;j<i;++j)); do
# perform your actions here on myArray[j]
case "${myArray[j]}" in
bob)
echo "boy"
;;
alicia)
echo "girl"
;;
cookie)
echo "dog"
;;
*)
echo "unknown" "${myArray[j]}"
;;
esac
done
但是当我使用以下命令执行代码时,我遇到了问题:
cat input.txt | ./prog.sh > file.txt
我有以下输入内容:
bob
alicia
amhed
cookie
daniel
在此输入中,我有足够的空间,但是当我运行程序时,却没有得到正确的结果。我需要我的代码不要考虑空格,但是如果照顾到空格,它会在OUTPOUT file.txt上写为“ unknown”。
我得到结果:
boy
girl
unknown amhed
dog
unknown
unknown
unknown daniel
那么我可以在不触摸输入文件的情况下消除/删除空格吗?
答案 0 :(得分:1)
为什么在bash
中这样做?
与awk
$ awk 'BEGIN{n=split("bob boy alicia girl cookie dog",x);
for(i=1;i<n;i+=2) a[x[i]]=x[i+1]} # build the lookup table
{print $1 in a?a[$1]:"unknown "$1}' file
boy
girl
unknown amhed
dog
unknown
unknown
unknown daniel
您也可以将查找映射外部化到另一个文件,这样,如果其中一个值发生更改,则无需修改代码。
答案 1 :(得分:1)
如果在输入行为空时不执行任何操作,可以将其添加到case
:
#!/usr/bin/env bash
# declare an array, to store stuff in
declare -a myArray
shopt -s nocasematch
# read the full file into the array
# This while loop terminates when pressing CTRL-D
i=1
while read -r line; do
myArray[i]="${line}"
((i++))
done < /dev/stdin
# Process the array
for ((j=1;j<i;++j)); do
# perform your actions here on myArray[j]
case "${myArray[j]}" in
"") # This is an empty line, skip it
;;
bob)
echo "boy"
;;
alicia)
echo "girl"
;;
cookie)
echo "dog"
;;
*)
echo "unknown" "${myArray[j]}"
;;
esac
done
或者,在将其添加到数组之前,请检查所读取的行是否为空。
答案 2 :(得分:0)
&& [[ -n $line ]]
确保只处理非空行。read
命令从/dev/stdin
读取它,因此您可以从代码中省略< /dev/stdin
。代码:
shopt -s nocasematch
while read -r line && [[ -n $line ]]; do
case "$line" in
bob)
echo "boy"
;;
alicia)
echo "girl"
;;
cookie)
echo "dog"
;;
*)
echo "unknown $line"
;;
esac
done
运行为:
./prog.sh < input.txt
输出:
boy
girl
unknown amhed
dog