我想把字符串的第一个字符放在首位,例如:第一个月我想得到"$"我在谷歌上搜索了一下,找到了一些解决方案,但它只涉及bash,而不是Sh !
"$"
Sh !
xkrw2x1b1#
您可能需要对 * specific * 值进行转义,以防止它被解释为shell变量,但是,如果您无法访问漂亮的bash子字符串工具,您仍然可以使用如下代码:
bash
name=paxdiablo firstchar=`echo $name | cut -c1-1`
如果您 * 确实 * 有bash(它在大多数Linux发行版上都可用,即使您的登录shell不是bash,您也应该能够使用它运行脚本),那么这就容易得多:
firstchar=${name:0:1}
要转义值,使其不被shell解释,您需要用途:
./first \$foreignKey
下面的first脚本显示了如何获取它:
first
letter=`echo $1 | cut -c1-1` echo ".$letter."
2nbm6dog2#
这应该可以在任何Posix兼容的shell上工作(包括sh)。printf不需要是内置的,但它经常是,所以这可能会保存一两个fork:
sh
printf
first_letter=$(printf %.1s "$1")
注意:(* 可能我应该在六年前写这个简短的答案时解释这一点。*)写%c而不是%.1s可能很诱人;除了参数"$1"为空的情况之外,生成完全相同的结果。printf %c ""实际上生成NUL字节,这在Posix shell中不是有效字符;不同的shell可能会对这种情况有不同的处理。2有些shell允许NUL作为扩展;其他的,比如bash,忽略NUL,但是生成一个错误消息告诉你它已经发生了,%.1s的精确语义是“在参数的开始处 * 最多 * 1个字符,这意味着如果参数是空字符串,first_letter保证被设置为空字符串,而不引发任何错误指示。
%c
%.1s
"$1"
printf %c ""
first_letter
oewdyzsn3#
也许这是一个老问题。最近我遇到了同样的问题,根据POSIX shell关于子字符串处理的手册,这是我的解决方案,不涉及任何subshell/fork第一个月
8hhllhi24#
用于壳体
echo "hello" | cut -b 1 # -b 1 extract the 1st byte h echo "hello" |grep -o "." | head -n 1 h echo "hello" | awk -F "" '{print $1}' h
你可以试试bash:
s='hello'; echo ${s:0:1} h
rdrgkggo5#
第一个月
5条答案
按热度按时间xkrw2x1b1#
您可能需要对 * specific * 值进行转义,以防止它被解释为shell变量,但是,如果您无法访问漂亮的
bash
子字符串工具,您仍然可以使用如下代码:如果您 * 确实 * 有
bash
(它在大多数Linux发行版上都可用,即使您的登录shell不是bash
,您也应该能够使用它运行脚本),那么这就容易得多:要转义值,使其不被shell解释,您需要用途:
下面的
first
脚本显示了如何获取它:2nbm6dog2#
这应该可以在任何Posix兼容的shell上工作(包括
sh
)。printf
不需要是内置的,但它经常是,所以这可能会保存一两个fork:注意:(* 可能我应该在六年前写这个简短的答案时解释这一点。*)写
%c
而不是%.1s
可能很诱人;除了参数"$1"
为空的情况之外,生成完全相同的结果。printf %c ""
实际上生成NUL字节,这在Posix shell中不是有效字符;不同的shell可能会对这种情况有不同的处理。2有些shell允许NUL作为扩展;其他的,比如bash,忽略NUL,但是生成一个错误消息告诉你它已经发生了,%.1s
的精确语义是“在参数的开始处 * 最多 * 1个字符,这意味着如果参数是空字符串,first_letter
保证被设置为空字符串,而不引发任何错误指示。oewdyzsn3#
也许这是一个老问题。最近我遇到了同样的问题,根据POSIX shell关于子字符串处理的手册,这是我的解决方案,不涉及任何subshell/fork
第一个月
8hhllhi24#
用于壳体
你可以试试bash:
rdrgkggo5#
第一个月