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


Answers:


138

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

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

16
简而言之,请使用:${str::1}
kenorb

16

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

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

1
我以为glob *仅匹配单个路径分量,/
而不

1
POSIX的相关引用是:pubs.opengroup.org/onlinepubs/9699919799/utilities/… “条件条件构造”语句“对应于几种模式中的第一种(请参见模式匹配表示法)”
Ciro Santilli法轮功

1
另外,如果要匹配a #,则必须使用引号。例如:'#'*) echo "found comment";;
Alexis Wilke

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

5
下注!您忘记在单括号中引用变量。foo='*'; [ ${foo:0:1} == "/" ] && echo 1 || echo 0将输出此错误bash: [: too many arguments。使用[ "${foo:0:1}" == "/" ] && echo 1 || echo 0或什至更好[[ ${foo:0:1} == "/" ]] && echo 1 || echo 0
Aleks-Daniel Jakimenko-A。

@ Aleks-DanielJakimenko-A。-devnull的答案在“ GNU bash版本4.3.48(1)-发行版(x86_64-pc-linux-gnu)版权所有(C)2013 Free Software Foundation,Inc.”中正常工作。
Craig Hicks

您的初始表达式:“ Downvote!您忘记了用大括号将变量引起来。” 表示在devnulls答案中输入的表达式不能像在bash上一样工作。您需要修改该初始表达式以正确传达您的技术要点,否则在逻辑上是不正确的。
Craig Hicks

1
@ Aleks-DanielJakimenko-A。否决错字?真?
Mausy5043

2
@ Mausy5043不是“错别字”,它是错误的且错误的。
Aleks-Daniel Jakimenko-A。

5

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'为了避免转义字符出现问题:https : //stackoverflow.com/a/40423558/895245例如:

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

\预期的输出。

${::} 似乎不是POSIX。

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


为什么printf呢?那是因为echo会删除空格吗?
Alexis Wilke

@AlexisWilkeecho对逃逸实现定义的行为,我认为:stackoverflow.com/questions/8467424/...
西罗桑蒂利郝海东冠状病六四事件法轮功
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.