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

wlzqhblo  于 2022-11-29  发布在  Unix
关注(0)|答案(5)|浏览(189)

我在Unix中写了一个脚本,我必须检查字符串中的第一个字符是否是“/”,如果是,则进行分支。
例如,我有一个字符串:

/some/directory/file

我希望返回1,并且:

server@10.200.200.20:/some/directory/file

返回0。

bsxbgnwa

bsxbgnwa1#

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

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
olqngx59

olqngx592#

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

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

8hhllhi23#

$ 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
e4eetjau

e4eetjau4#

printf '%c“$s”

brunoais在评论中提到了这一点,它可能是最佳选择,因为:

如果参数操作数未完全用于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。
另请参阅:* How can I extract the first two characters of a string in shell scripting? *

bnlyeluc

bnlyeluc5#

编码:

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

输出量:

P

相关问题