linux外壳标题案例

linux外壳标题案例,linux,shell,variables,Linux,Shell,Variables,我正在编写一个shell脚本,并且有这样一个变量:一些连字符的东西 我需要在脚本的各个点中使用它,如下所示: 连字符的某物,连字符的某物,连字符的某物 通过使用sed“s/-//g”剥离-,我成功地将其更改为一些连字符的内容 我相信有一个更简单的方法,而且,需要知道如何获得骆驼壳版本 编辑:源自@Michał答案的工作函数 function hyphenToCamel { tr '-' '\n' | awk '{printf "%s%s", toupper(substr($0,1,1))

我正在编写一个shell脚本,并且有这样一个变量:
一些连字符的东西

我需要在脚本的各个点中使用它,如下所示:

连字符的某物
连字符的某物
连字符的某物

通过使用
sed“s/-//g”
剥离
-
,我成功地将其更改为
一些连字符的内容

我相信有一个更简单的方法,而且,需要知道如何获得骆驼壳版本

编辑:源自@Michał答案的工作函数

function hyphenToCamel {
    tr '-' '\n' | awk '{printf "%s%s", toupper(substr($0,1,1)), substr($0,2)}'
}

CAMEL=$(echo something-that-is-hyphenated | hyphenToCamel)
echo $CAMEL
编辑:最后,感谢@glenn,一个sed一行

echo a-hyphenated-string | sed -E "s/(^|-)([a-z])/\u\2/g"

在壳中,你被困在混乱中:

aa="aaa-aaa-bbb-bbb" echo " $aa" | sed -e 's/--*/ /g' -e 's/ a/A/g' -e 's/ b/B/g' ... -e 's/ *//g' aa=“aaa aaa bbb bbb” 回音“$aa”| sed-e's/--*//g'-e's/a/a/g'-e's/b/b/g'-e's/*//g' 注意echo中仔细放置的空格和最后-e中的双空格

我把它作为完成代码的练习

在perl中,作为一行shell命令更容易一些:

perl -e 'print map{ $a = ucfirst; $a =~ s/ +//g; $a} split( /-+/, $ARGV[0] ), "\n"' $aa perl-e'print map{$a=ucfirst;$a=~s/+//g;$a}split(/-+/,$ARGV[0]),“\n”'$aa
您可以定义一个函数:

hypenToCamel() { 
    tr '-' '\n' | awk '{printf "%s%s", toupper(substr($0,0,1)), substr($0,2)}'
}

CAMEL=$(echo something-that-is-hyphenated | hypenToCamel)
echo $CAMEL
纯粹的巴什主义:

var0=something-that-is-hyphenated
var1=(${var0//-/ })
var2=${var1[*]^}
var3=${var2// /}
echo $var3
SomethingThatIsHyphenated
第1行很简单。
第2行是replaceAll或
的//-//g'
的bashim,用parens包装以构建数组。
第3行使用了
${foo^}
,这意味着大写(而
${foo,}
将意味着“小写”[注意,
^
如何向上指向,而
向下指向]),但是为了对单词的每个第一个字母进行操作,我们使用
${foo[*]}
(或者
${foo[]}
,如果您愿意的话)。
第4行同样是“全部替换”:空白,无任何内容。
第5行同样是琐碎的

GNU使用的一个班轮

echo something-that-is-hyphenated | 
sed -e 's/-\([a-z]\)/\u\1/g' -e 's/^[a-z]/\u&/'

替换字符串中的
\u
记录在中。

对于记录,这里有一个纯Bash安全方法(不受路径名扩展的约束)-使用Bash≥4:

var0=something-that-is-hyphenated
IFS=- read -r -d '' -a var1 < <(printf '%s\0' "${var0,,}")
printf '%s' "${var1[@]^}"
var0=连字符的东西

IFS=-read-r-d''-a var1<看看这个-有什么原因不能只使用相同的变量名吗?你给脚本增加了很多不必要的复杂性。我正在构建Tianium项目文件,需要使用我的项目名称作为应用程序名称,项目目录,但com.domain.myprojectname作为应用程序id,后来com.domain.myprojectname/.MyProjectNameActivity在android设备上的adb外壳中启动了它。不太管用-但通过一些编辑(现在添加到我的问题中)让它工作只是
toupper
中的
substr
需要是
substr($0,1,1)
如果你在bash中,请注意
${var//string/replacement}
。您甚至可以在纯Bash中编写CamelCase转换代码,尽管这会有点繁琐。或者干脆
回显a-hyphenated-string | sed-E“s/(^ |-)([a-z])/\u\2/g”
。很棒。我找不到
man sed
中记录的功能。谢谢-这正是我要找的。整洁!借用(带有adapations)不错,但缺少一些健康的引用(因此需要扩展路径名)。我建议:
var0=用连字符连接的东西;IFS=-read-r-d''-a var1<@gniourf\u gniourf:你能更具体地说明它在哪里需要引号,以及它如何进行路径名扩展吗,可能有一个例子?之后你不需要重置IFS吗?@userunknown:下面是它的中断方式:
var0=hello-*-user unknownn
(从包含一些文件的目录中执行)。您无法修复此行为(除了不鼓励使用
set-f
)。关于我的解决方案:不,我不需要重置
IFS
。它只为命令
read
设置(类似于环境变量)是的,如果变量名中有星号,但示例中只包含字母和连字符,因此这是一个非常广泛的假设。