如何在 Bash 或 Unix shell 中检查字符串中的第一个字符?

问题描述 投票:0回答:5

我正在 Unix 中编写一个脚本,我必须检查字符串中的第一个字符是否是“/”,如果是,则分支。

例如我有一个字符串:

/some/directory/file

我希望它返回 1,并且:

[email protected]:/some/directory/file

返回0。

string bash unix character exitstatus
5个回答
191
投票

有很多方法可以做到这一点。您可以在双括号中使用通配符:

str="/some/directory/file"
if [[ $str == /* ]]; then echo 1; else echo 0; fi

您可以使用子字符串扩展:

if [[ ${str:0:1} == "/" ]] ; then echo 1; else echo 0; fi

或者正则表达式:

if [[ $str =~ ^/ ]]; then echo 1; else echo 0; fi

20
投票

还要考虑与大多数基于 sh 的 shell 兼容的 case 语句:

case $str in
/*)
    echo 1
    ;;
*)
    echo 0
    ;;
esac

13
投票
$ foo="/some/directory/file"
$ [ ${foo:0:1} == "/" ] && echo 1 || echo 0
1
$ foo="[email protected]:/some/directory/file"
$ [ ${foo:0:1} == "/" ] && echo 1 || echo 0
0

9
投票

printf '%c' "$s"

这是 brunoais 在评论中提到的,它可能是最好的选择,因为:

  • 很可能是POSIX。待办事项确认。以下来自 https://pubs.opengroup.org/onlinepubs/9699919799/utilities/printf.html 的引用表明了这一点:

    如果参数操作数未完全用于 b、c 或 s 转换,则不应被视为错误。

  • 它可以将字符提取到变量中,与直接使用

    case
    不同

  • cut -c1
    不同,
    printf
    是 Bash 内置的,所以它可能会更快一点

myvar=abc
first_char="$(printf '%c' "$myvar")"
if [ "$first_char" = a ]; then
  echo 'starts with a'
else
  echo 'does not start with a'
fi

cut -c1

这是 POSIX,与

case
不同:

myvar=abc
first_char="$(printf '%s' "$myvar" | cut -c1)"
if [ "$first_char" = a ]; then
  echo 'starts with a'
else
  echo 'does not start with a'
fi

awk substr
是另一个 POSIX 命令,但效率较低:

printf '%s' "$myvar" | awk '{print substr ($0, 0, 1)}'

printf '%s'
是为了避免转义字符出现问题: Bash printf 文字逐字字符串,例如,

myvar='\n'
printf '%s' "$myvar" | cut -c1

输出

\
符合预期。

${::}
似乎不是 POSIX。

另请参阅:如何在 shell 脚本中提取字符串的前两个字符?


3
投票

代码:

 place="Place"
 fchar=${place:0:1}
 echo $fchar

输出:

P
© www.soinside.com 2019 - 2024. All rights reserved.