用于测试传递字符串的条件的 shell 脚本

用于测试传递字符串的条件的 shell 脚本

条件字符串以大写字母或小写字母或下划线开头,例如 _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

那是因为这些是保留字符。

& 表示在后台运行命令

* 解析为实际目录中的所有文件/目录,然后将其作为参数传递

() 用于命令顺序首选项或函数声明

如果你想在字符串中出现这样的字符,请将其放在引号“”或''中

相关内容