我是计算机技术专业的第一年学生,之前从未实际使用过Linux。我很快掌握了脚本的基础知识,并且正在尝试编写一个脚本,为每个作业创建一个目录和一个软链接。看到我们平均每周两次任务,我认为这会有所帮助。
我无法让我的脚本只接受数字作为变量。我主要是使用3个case语句来工作(主要是),但是如果可以的话,宁愿使用带有if语句的基本正则表达式。
if [ $# != 1 ]; then
red='\033[0;31m'
NC='\033[0m'
blue='\033[1;34m'
NC='\033[0m'
echo 1>&2 "${blue}ERROR:${NC} $0 :${red}expecting only one variable, you gave $#($*)${NC}"
echo 1>&2 "${blue}Usage:${NC} $0 :${red}number of assignment.${NC}"
exit 2
fi
case $1 in
[[:punct:]]*) echo 1>&2 "Numeric Values Only"
exit 2
;;
[[:alpha:]]*) echo 1>&2 "Numeric Values Only"
exit 2
;;
[[:space:]]*) echo 1>&2 "Numeric Values Only"
exit 2
;;
esac
然后脚本生成目录并为标记脚本(如果已发布)创建软链接,并结束。任何人都可以帮我缩短/消除案例陈述
答案 0 :(得分:1)
您不能在便携式shell脚本中使用正则表达式(可在任何符合POSIX标准的shell上运行的脚本)。通常,shell中的模式是globs,而不是正则表达式。
也就是说,还有其他一些选择。如果你专门使用Bash,你有两个选择;你可以使用扩展的globs,它可以为你提供一些类似于regex的功能:
shopt -s extglob
case $1 in
+([[:digit:]]) ) echo "digits" ;;
*) echo "not digits" ;;
esac
另一种选择是Bash在[[ ]]
conditional construct中有=~
运算符来匹配正则表达式的字符串;这不适用于case
语句,但适用于if
:
if [[ $1 =~ [0-9]+ ]]
then
echo "digits"
fi
最后,如果你想要进行可移植的正则表达式匹配(因此它将在其他POSIX shell中运行,如ash
,dash
,ksh
,zsh
等) ,你可以呼叫grep
;如果您通过-q
,它将对匹配保持沉默但返回成功或失败,具体取决于输入是否匹配:
if echo "$1" | grep -qE "[0-9]+"
then
echo "digits"
fi