我是一年级计算机技术专业的学生,之前从未真正使用过 linux。我很快就掌握了脚本编写的基础知识,并且正在尝试编写一个脚本来为每个作业创建一个目录和一个软链接(soft link)。看到我们平均每周完成两次作业,我认为这会有所帮助。
我无法让我的脚本只接受数字作为变量。我主要(主要)使用 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
脚本然后创建目录并为标记脚本(如果已发布)创建软链接(soft link),然后结束。谁能帮我缩短/消除案例陈述
最佳答案
您不能在可移植的 shell 脚本(将在任何 POSIX 兼容的 shell 上运行的脚本)中使用正则表达式。一般来说,shell 中的模式是 globs ,不是正则表达式。
也就是说,还有其他一些选择。如果您专门使用 Bash,则有两种选择;你可以使用扩展的 globs,它给你一些类似正则表达式的功能:
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
关于regex - 我可以在 bash shell 脚本中使用正则表达式吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29040069/