在fruitlist数组中,我需要循环并打印,因为我喜欢苹果,我喜欢番茄(es) 应该捕获最后一个字母,并根据它我应该附加(s)或(es)。我无法以这种方式获得最后的价值。
当我尝试echo $ fn |时tail -c 2,它给出了最后一个值,但这里没有。
我必须遗漏一些东西。
#!/bin/sh
fruitlist="apple pear tomato peach grape";
last="";
append="";
for fn in $fruitlist
do
last=$fn | tail -c 2;
echo "I like " $fn $append
done
修改
将检查AND追加或(es)
的逻辑如果test last =“o”;然后追加=“es”; 否则追加=“s”
编辑2
如果其他条件设置(s)或(es)
,则需要使用此选项答案 0 :(得分:4)
你可以在System V sh的所有shell中兼容这个。只需使用case语句就可以使用glob模式。
#!/bin/sh
fruitlist="apple pear tomato peach grape"
for a in $fruitlist; do
case $a in
*o)
append=es
;;
*)
append=s
;;
esac
echo "${a}${append}"
done
输出:
apples
pears
tomatoes
peachs
grapes
另请注意,如何使用${var}
形式将变量名称放在双引号""
内的另一个有效变量字符旁边。使用双引号引用变量对于初学者来说总是一个很好的做法。
仍然建议您尽快学习或使用bash,因为POSIX shell在阻止字段拆分过程中可能的路径名扩展方面有限制,如for in word; do ...; done
。
对于OP的编辑#2,这仍然适用于通过sh
调用的bash:
#!/bin/sh
fruitlist="apple pear tomato peach grape"
for a in $fruitlist; do
if [[ $a == *o ]]; then
append=es
else
append=s
fi
echo "${a}${append}"
done
似乎POSIX模式还有另一种方式:
#!/bin/sh
fruitlist="apple pear tomato peach grape"
for a in $fruitlist; do
if [ "$a" != "${a%o}" ]; then
append=es
else
append=s
fi
echo "${a}${append}"
done
答案 1 :(得分:3)
这是bash
,而不是sh
:
#!/bin/bash
fruitlist=(apple pear tomato peach grape);
for curFruit in "${fruitlist[@]}"; do
[[ ${curFruit: -1} == 'o' ]] && ending='es' || ending='s'
echo "I like ${curFruit}$ending"
done
另请注意,您无法删除${curFruit: -1}
中的空格。如果没有空格字符,它将成为default value的语法。
另外,如果你不喜欢一行语法,请使用:
if [[ ${curFruit: -1} == 'o' ]]; then
ending='es'
else
ending='s'
fi
答案 2 :(得分:0)
如果你可以使用bash,那么正则表达式匹配就是你想要的:
do
[[ $fn =~ o|h$ ]] && append="e" || append=""
echo "I like $fn(${append}s)"
done
否则,如果你想坚持sh,你可以使用tail:
do
last=$(echo -n "$fn" | tail -c 1)
[ "$last" = o ] || [ "$last" = h ] && append="e" || append=""
echo "I like $fn(${append}s)"
done
最后,您可以将展开用作aleks suggestts。
答案 3 :(得分:0)
这可能适合你(Bash):
a=($fruitlist) # put fruitlist into an array `a`
b=(${a[@]/%o/oe}) # replace words ending in `o` with `oe`
printf "%s\n" ${b[@]/%/s} # append `s` to all words and print out