我想先写一个字符串的第一个字符,例如:
$>./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)
好吧,您可能需要转义该特定值以防止它被解释为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)
也许这是一个老问题了。最近我遇到了同样的问题,根据POSIX shell手册关于子字符串处理,这是我的解决方案,不涉及任何子shell/fork
a="some string here"
printf 'first char is "%s"\n' "${a%"${a#?}"}"
| 归档时间: |
|
| 查看次数: |
9796 次 |
| 最近记录: |