1

在fruitlist数组中,我需要循环并打印,因为我喜欢apple(s),我喜欢tomato(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 附加 (s) 或 (es) 的逻辑

如果测试最后=“o”;然后追加=“es”;否则附加=“s”

编辑 2

需要这个才能使用 if then else 条件来设置 (s) 或 (es)

4

4 回答 4

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 限制了在分词期间防止可能的路径名扩展,例如 in for in word; do ...; done

对于 OP 的编辑#2,这仍然适用于通过调用的 bash sh

#!/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
于 2013-09-05T17:46:30.850 回答
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}. 如果没有空格字符,它将成为默认值的语法。

此外,如果您不喜欢一行 if 语法,请使用以下命令:

if [[ ${curFruit: -1} == 'o' ]]; then
    ending='es'
else
    ending='s'
fi
于 2013-09-05T17:32:47.693 回答
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

最后,您可以将扩展用作aleksSuggestts

于 2013-09-05T17:46:21.253 回答
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
于 2013-09-05T20:08:55.630 回答