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

can*_*cse 62 unix string bash character exitstatus

我在UNIX中编写脚本,我必须检查字符串中的第一个字符是否为"/",如果是,则为branch.

例如,我有一个字符串:

/some/directory/file
Run Code Online (Sandbox Code Playgroud)

我希望这返回1,并且:

server@10.200.200.20:/some/directory/file
Run Code Online (Sandbox Code Playgroud)

返回0.

use*_*001 113

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

str="/some/directory/file"
if [[ $str == /* ]]; then echo 1; else echo 0; fi
Run Code Online (Sandbox Code Playgroud)

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

if [[ ${str:0:1} == "/" ]] ; then echo 1; else echo 0; fi
Run Code Online (Sandbox Code Playgroud)

或正则表达式:

if [[ $str =~ ^/ ]]; then echo 1; else echo 0; fi
Run Code Online (Sandbox Code Playgroud)

  • 简而言之,使用:`$ {str :: 1}`. (5认同)

kon*_*box 14

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

case "$STRING" in
/*)
    echo 1
    ;;
*)
    echo 0
    ;;
esac
Run Code Online (Sandbox Code Playgroud)


dev*_*ull 9

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

  • Downvote!你忘了在单个括号中引用你的变量.``富= '*'; [$ {foo:0:1} =="/"] && echo 1 || echo 0``将输出这个错误``bash:[:太多的参数``.使用``["$ {foo:0:1}"=="/"] && echo 1 || echo 0``甚至更好``[[$ {foo:0:1} =="/"]] && echo 1 || echo 0`` (4认同)
  • @Mausy5043 这不是“错别字”,它是错误的和错误的。 (2认同)

Cir*_*四事件 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
Run Code Online (Sandbox Code Playgroud)

awk substr 是另一种 POSIX 但效率较低的替代方案:

printf '%s' "$myvar" | awk '{print substr ($0, 0, 1)}'
Run Code Online (Sandbox Code Playgroud)

printf '%s'是为了避免转义字符出现问题:https : //stackoverflow.com/a/40423558/895245例如:

myvar='\n'
printf '%s' "$myvar" | cut -c1
Run Code Online (Sandbox Code Playgroud)

输出\如预期。

${::} 似乎不是 POSIX。

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