我正在UNIX中编写脚本,在该脚本中,我必须检查字符串中的第一个字符是否为“ /”,如果是,则分支。
例如我有一个字符串:
/some/directory/file
我希望它返回1,并且:
server@10.200.200.20:/some/directory/file
返回0。
Answers:
有很多方法可以做到这一点。您可以在双括号中使用通配符:
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
${str::1}
。
还要考虑case语句,它与大多数基于sh的shell兼容:
case $str in
/*)
echo 1
;;
*)
echo 0
;;
esac
*
仅匹配单个路径分量,/
#
,则必须使用引号。例如:'#'*) echo "found comment";;
。
$ 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
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
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。
printf
呢?那是因为echo
会删除空格吗?
echo
对逃逸实现定义的行为,我认为:stackoverflow.com/questions/8467424/...