我正在编写一个程序,可以将大写转换为小写,小写也可以转换为大写。以下是一些例子。
abcde - > ABCDE
ABCDE - > ABCDE
abCdE - > ABCDE
我知道如何在c中制作它而不是shell脚本。这是c代码。
1 #include <stdio.h>
2 #include <ctype.h>
3 #include <stdlib.h>
4 #include <string.h>
5
6 int main(int args, char* argv[])
7 {
8
9 if(args != 2)
10 exit(1);
11 char buf[100];
12 for(int i = 0; i < strlen(argv[1]); i++)
13 {
14 if(i%2 == 0)
15 buf[i] = tolower(argv[1][i]);
16 else
17 buf[i] = toupper(argv[1][i]);
18 }
19 printf("%s\n", buf);
20 }
你们能帮助我如何用shell脚本编写它吗? 谢谢。
答案 0 :(得分:2)
使用sed
,您可以重复解析2个字符,将第一个更改为小写,第二个更改为大写。这看起来不错,但是带有奇数个字符的字符串的最后一个字符呢?
首先将最后一个char更改为小写。这对于奇数长度的字符串是可以的,并且将使用第二个命令修改为偶数长度的字符串:
if [ $# -ne 1 ]; then
exit 1
fi
lastcharlow=$(sed -r "s/(.)$/\l\1/" <<< "${1}")
sed -r "s/(.)(.)/\l\1\u\2/g" <<<"${lastcharlow}"
最后两行可以合并:
sed -r "s/(.)$/\l\1/; s/(.)(.)/\l\1\u\2/g" <<<"${1}"
编辑:文字
sed解决方案很好而且简短,但没有显示如何循环字符串。当你真的不知道一个适合你的工具时,你可以遍历你的字符串。 我将展示3种用于更改char的情况的方法和用于循环字符串的两种函数。
function upper {
# tr '[:lower:]' '[:upper:]' <<< $1
# echo "${1^^}"
typeset -u up; up="$1"; echo "${up}"
}
function lower {
# tr '[:upper:]' '[:lower:]' <<< $1
# echo "${1,,}"
typeset -l low; low="$1"; echo "${low}"
}
function grepsolution {
i=0
while read -r onechar; do
(( i++ ))
if [[ $((i%2)) = 0 ]] ; then
printf "%s" $(upper "${onechar}" )
else
printf "%s" $(lower "${onechar}" )
fi
done < <(echo $1 | grep -o .)
printf "\n"
}
function substr_solution {
i=0
while [ $i -lt ${#1} ]; do
(( i++ ))
if [[ $((i%2)) = 0 ]] ; then
printf "%s" $(upper "${1:i-1:1}" )
else
printf "%s" $(lower "${1:i-1:1}" )
fi
done
printf "\n"
}
for teststring in abcde abcdef ABCDE ABCDEF; do
echo "Converting ${teststring}"
printf "%-20s: " "grepsolution"
grepsolution "${teststring}"
printf "%-20s: " "substr_solution"
substr_solution "${teststring}"
done
答案 1 :(得分:-1)
您没有说出要使用的shell。根据外壳,这可能很复杂或容易。
例如,在Zsh中,它非常简单:
myvar="abcd"
myvar_uppercase=${(U)myvar}