95

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

例如,我有一个字符串:

/some/directory/file

我希望它返回 1,并且:

server@10.200.200.20:/some/directory/file

返回 0。

4

4 回答 4

165

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

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
于 2013-08-28T12:47:59.017 回答
19

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

case $str in
/*)
    echo 1
    ;;
*)
    echo 0
    ;;
esac
于 2013-08-28T13:16:38.807 回答
11
$ foo="/some/directory/file"
$ [ ${foo:0:1} == "/" ] && echo 1 || echo 0
1
$ foo="server@10.200.200.20:/some/directory/file"
$ [ ${foo:0:1} == "/" ] && echo 1 || echo 0
0
于 2013-08-28T12:49:55.693 回答
7

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 literal verbatim string,例如,

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

\按预期输出。

${::}似乎不是POSIX。

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

于 2018-08-07T06:07:12.647 回答