条件字符串以大写字母或小写字母或下划线开头,例如 _abc 或 xyz 或 Abc
字符串在第一个字符后可能包含数字,例如 _f9 或 f10 或 car20 或 top10cars
字符串不应包含特殊字符,例如 ! @# $ % ^ & * ( ) + - =
这是我的小脚本
if [[ $1 =~ ^[A-Za-z_]+$ ]]; then
echo it matches
else
echo does_not match
fi
当我仅传递 & 或 * 或 ( 之类的参数时,脚本不起作用,有时光标永远不会回来,我需要按 ctrl+c
for example ./script.sh (abc
./script.sh &&
./script.sh &abc
脚本出了什么问题
答案1
引用。
在脚本中,使用"$1"
而不仅仅是$1
.
在命令行上,使用
./script '*(ontehu'
代替
./script *(ontehu
./script.sh (abc
这是shell语法中的一个语法错误。./script.sh &&
这使得 shell 认为命令行上有一个条件 AND,并且它期望运算符右侧有一些内容&&
。./script.sh &abc
这是两个命令:./script
作为后台进程启动(使用&
)和命令abc
。
在所有这些情况下,参数都应该加引号(理想情况下是单引号,除非您需要 shell 插入 shell 变量的值,在这种情况下应该用双引号)。
你的脚本:
if [[ $1 =~ ^[A-Za-z_]+$ ]]; then
echo it matches
else
echo does_not match
fi
引用$1
:
if [[ "$1" =~ ^[A-Za-z_]+$ ]]; then
echo it matches
else
echo does_not match
fi
允许值尾部有数字:
if [[ "$1" =~ ^[A-Za-z_][A-Za-z0-9_]+$ ]]; then
echo it matches
else
echo does_not match
fi
正确报告错误(这是额外的):
if [[ "$1" =~ ^[A-Za-z_][A-Za-z0-9_]+$ ]]; then
printf '"%s" is a valid variable name\n' "$1"
else
printf '"%s" is not a proper variable name\n' "$1" >&2
exit 1
fi
答案2
那是因为这些是保留字符。
& 表示在后台运行命令
* 解析为实际目录中的所有文件/目录,然后将其作为参数传递
() 用于命令顺序首选项或函数声明
如果你想在字符串中出现这样的字符,请将其放在引号“”或''中