获取字符串SHELL的第一个字符

03t*_*t02 3 linux sh

我想先写一个字符串的第一个字符,例如:

$>./first $foreignKey

我想得到 "$"

我搜索了它,我发现了一些解决方案,但它只涉及bash而不是 Sh !

ric*_*ici 22

这应该适用于任何 Posix 兼容 shell(包括sh)。printf不需要是内置的,但通常是内置的,所以这可能会节省一两个分支:

first_letter=$(printf %.1s "$1")
Run Code Online (Sandbox Code Playgroud)

注意:(也许六年前当我写这个简短的答案时我应该解释一下这一点。)可能会很想写%c而不是%.1s; 除了参数为空的情况外,它会产生完全相同的结果"$1"printf %c ""实际上产生一个 NUL 字节,它在 Posix shell 中不是有效字符;不同的 shell 可能会以不同的方式处理这种情况。有些允许 NUL 作为扩展;有些则允许 NUL 作为扩展。其他的,比如 bash,会忽略 NUL,但会生成一条错误消息来告诉您它已经发生了。的精确语义%.1s是 "在参数开头最多first_letter1 个字符,这意味着如果参数是空字符串,则保证设置为空字符串,而不会引发任何错误指示。


Hac*_*lic 10

对于外壳sh

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
Run Code Online (Sandbox Code Playgroud)

你可以在 bash 上尝试这个:

s='hello'; echo ${s:0:1}
h
Run Code Online (Sandbox Code Playgroud)

  • 不,我不能,因为这是一个 _bash_ 解决方案 (4认同)

pax*_*blo 7

好吧,您可能需要转义该特定值以防止它被解释为shell变量,但是,如果您无法访问漂亮的bash子字符串工具,您仍然可以使用以下内容:

name=paxdiablo
firstchar=`echo $name | cut -c1-1`
Run Code Online (Sandbox Code Playgroud)

如果你这样做bash(它可在大多数Linux发行版,而且即使你的登录shell是不是bash,你应该能够运行它的脚本),这是容易得多:

firstchar=${name:0:1}
Run Code Online (Sandbox Code Playgroud)

要转义值以使其不被shell解释,您需要使用:

./first \$foreignKey
Run Code Online (Sandbox Code Playgroud)

以下first脚本显示了如何获取它:

letter=`echo $1 | cut -c1-1`
echo ".$letter."
Run Code Online (Sandbox Code Playgroud)

  • @ 03t02:无法完成.在程序/脚本启动之前,shell会解释`$`.如果你不想解释它,你必须以某种方式逃避它. (2认同)

win*_*n-t 7

也许这是一个老问题了。最近我遇到了同样的问题,根据POSIX shell手册关于子字符串处理,这是我的解决方案,不涉及任何子shell/fork

a="some string here" printf 'first char is "%s"\n' "${a%"${a#?}"}"

  • 删除除第一个字符之外的所有字符的最小后缀,就像删除一个字符的最小前缀一样。这可以在 XCU - Shell Command Langauge 中找到,例如在 Open Group 基本规范第 7 期,2018 年版中:https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_02 - x-参考:https://unix.stackexchange.com/q/389209/9340 (2认同)