在bash中将函数参数从大写转换为小写

在bash中将函数参数从大写转换为小写,bash,case-sensitive,tr,Bash,Case Sensitive,Tr,我正在尝试制作一个方便的函数来解决我不小心打开了caps锁并且试图运行一些区分大小写的工具时出现的问题 e、 g.我偶尔发现自己输入的是makedebug,而不是makedebug 我现在所做的非常简单:alias MAKE=“MAKE”并编辑makefile以复制规则,例如DEBUG:DEBUG 我更喜欢对参数有效的解决方案,而不必修改所涉及的工具。这里有一个解决方案,尽管它并不完美: alias MAKE="make `tr '[:upper:]' '[:lower:]`" 它可以工作,但

我正在尝试制作一个方便的函数来解决我不小心打开了caps锁并且试图运行一些区分大小写的工具时出现的问题

e、 g.我偶尔发现自己输入的是
makedebug
,而不是
makedebug

我现在所做的非常简单:
alias MAKE=“MAKE”
并编辑makefile以复制规则,例如
DEBUG:DEBUG


我更喜欢对参数有效的解决方案,而不必修改所涉及的工具。

这里有一个解决方案,尽管它并不完美:

alias MAKE="make `tr '[:upper:]' '[:lower:]`"

它可以工作,但有一个不幸的问题,我需要在任何操作开始执行之前按Ctrl-D发送EOF。

这里有一个解决方案,尽管它并不完美:

alias MAKE="make `tr '[:upper:]' '[:lower:]`"

它可以工作,但有一个不幸的问题,我需要在开始执行任何操作之前按Ctrl-D发送EOF。

这涉及到一个脚本,但避免了我先前尝试的Ctrl-D问题:

对于每个命令,都有一个别名,如

alias MAKE="casefixer make"
然后是我在
/usr/local/bin/casefixer
创建的以下文件:

#!/bin/bash
command=`echo $1 | tr '[:upper:]' '[:lower:]'`       # convert 1st arg to lowercase, it's the command to invoke
shift                                                # remove 1st arg from $*
$command `echo "$*" | tr '[:upper:]' '[:lower:]'`    # convert arguments to lowercase, and invoke the command with them

这涉及到一个脚本,但避免了我先前尝试的Ctrl-D问题:

对于每个命令,都有一个别名,如

alias MAKE="casefixer make"
然后是我在
/usr/local/bin/casefixer
创建的以下文件:

#!/bin/bash
command=`echo $1 | tr '[:upper:]' '[:lower:]'`       # convert 1st arg to lowercase, it's the command to invoke
shift                                                # remove 1st arg from $*
$command `echo "$*" | tr '[:upper:]' '[:lower:]'`    # convert arguments to lowercase, and invoke the command with them

这里值得一提的是
readline
命令“downcase word”(默认情况下绑定到
M-u
)。假设您键入了“makedebug”。如果在按回车键之前捕捉到它,可以使用
C-a
将光标移动到行首。(否则,请先使用向上箭头返回命令)。然后,每次点击
M-u
,光标后面的单词将变为小写,光标将移动到下一个单词的开头


这有点费劲,而且我看不到一次将整行小写的方法。也许有人可以对此进行改进。

这里值得一提的是
readline
命令“downcase word”(默认情况下绑定到
M-u
)。假设您键入了“makedebug”。如果在按回车键之前捕捉到它,可以使用
C-a
将光标移动到行首。(否则,请先使用向上箭头返回命令)。然后,每次点击
M-u
,光标后面的单词将变为小写,光标将移动到下一个单词的开头

这有点费劲,而且我看不到一次将整行小写的方法。也许有人可以改进这一点。

使用GNU-sed 如果您只希望makefile中的所有内容都是小写的,那么可以使用GNU sed将整个内容都小写:

sed -i 's/.*/\L&/' Makefile
您还可以构建一个更具辨别力的sed脚本,但它是您的朋友

使用tr 由于您将问题标记为tr,您可能还需要tr解决方案。这有点麻烦,因为tr不会进行就地翻译,但您可以洗牌temp文件或使用moreutils中的海绵。例如:

tr '[[:upper:]]' '[[:lower:]]' < Makefile | sponge Makefile
tr'[:upper:][]'[:lower:][]'
使用GNU sed 如果您只希望makefile中的所有内容都是小写的,那么可以使用GNU sed将整个内容都小写:

sed -i 's/.*/\L&/' Makefile
您还可以构建一个更具辨别力的sed脚本,但它是您的朋友

使用tr 由于您将问题标记为tr,您可能还需要tr解决方案。这有点麻烦,因为tr不会进行就地翻译,但您可以洗牌temp文件或使用moreutils中的海绵。例如:

tr '[[:upper:]]' '[[:lower:]]' < Makefile | sponge Makefile
tr'[:upper:][]'[:lower:][]'
利用@Clayton Hughes的解决方案,这里有一个解决方案可以处理一些有趣的事情,比如参数中的空格(这会把事情弄得一团糟):


注意:
eval
是一件相当危险的事情,其造成的后果是当之无愧的。但是,在这种情况下,将命令及其参数与%q一起双引号和编码应该可以避免出现问题。至少,我找不到它做了任何意外事情的案例。

在@Clayton Hughes的
案例修复解决方案中,这里有一个解决方案可以处理一些有趣的事情,比如参数中的空格(这
$*
会把事情搞砸):


注意:
eval
是一件相当危险的事情,其造成的后果是当之无愧的。但是,在这种情况下,将命令及其参数与%q一起双引号和编码应该可以避免出现问题。至少,我找不到它做了什么意外的事情。

你真的用了caps lock钥匙吗?令人印象深刻;-)我发现自己使用了很多库,它们非常喜欢用大写来定义所有内容。这真是令人印象深刻。我,我只是在输入很长很长的变量名或其他什么的时候,扭曲手指按住shift键,弄伤了我的手。你真的用了大写锁定键吗?令人印象深刻;-)我发现自己使用了很多库,它们非常喜欢用大写来定义所有内容。这真是令人印象深刻。对我来说,我只是在输入很长的变量名或其他什么的时候,扭曲手指按住shift键,弄伤了我的手。
M-9M-l
(字母LL)会把接下来的9个单词写下来
M-99M-l
将在下一个99小时内停机
M--M-l
将对前一个单词进行降格
M--3M-l
(如果使用的是3而不是
Esc
,则在按3之前释放
Alt
M-u
在默认情况下至少在我的系统上绑定到
upcase word
。我必须承认我的无知。
X-X
语法是什么意思?我该如何输入它?
M-9M-l
(字母ell)将对接下来的9个单词进行小写
M-99M-l
将在下一个99小时内停机
M--M-l
将对前一个单词进行降格<代码>M--3M-l
(pr前释放
Alt