循环遍历unix数组并获取最后一个字符并追加字符串

时间:2013-09-05 17:21:45

标签: linux bash shell character

在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)

,则需要使用此选项

4 个答案:

答案 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