我想要字符串的第一个字符,例如:
$>./first $foreignKey
我想得到
"$"
我用谷歌搜索,找到了一些解决方案,但它只涉及 bash 而不是
Sh !
这应该适用于任何 Posix 兼容 shell(包括
sh
)。 printf
不需要是内置的,但通常是内置的,所以这可能会节省一两个叉子:
first_letter=$(printf %.1s "$1")
注意:(也许六年前我写这个简短答案时就应该解释这一点。)写
%c
而不是%.1s
可能很诱人;除了参数 "$1"
为空的情况之外,它会产生完全相同的结果。 printf %c ""
实际上产生一个 NUL 字节,这在 Posix shell 中不是有效字符;不同的 shell 可能会以不同的方式处理这种情况。有些允许 NUL 作为扩展;有些则允许 NUL 作为扩展。其他的,比如 bash,会忽略 NUL,但会生成一条错误消息来告诉您它已经发生了。 %.1s
的精确语义是“参数开头最多有 1 个字符,这意味着如果参数是空字符串,则保证将 first_letter
设置为空字符串,而不会引发任何错误指示. 值以防止它被解释为 shell 变量,但是,如果您无权访问漂亮的 bash
子字符串工具,您仍然可以使用类似以下内容:
name=paxdiablo
firstchar=`echo $name | cut -c1-1`
如果您do
有 bash
(它在大多数 Linux 发行版上都可用,即使您的登录 shell 不是
bash
,您也应该能够使用它运行脚本),那就容易多了:firstchar=${name:0:1}
要转义该值,使其不被 shell 解释,您需要使用:
./first \$foreignKey
以下
first
脚本展示了如何获取它:
letter=`echo $1 | cut -c1-1`
echo ".$letter."
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
a="some string here"
printf 'first char is "%s"\n' "${a%"${a#?}"}"
printf -v first_character "%c" "${variable}"