关于人工智能:自动化测试基础知识Bash基础

61次阅读

共计 6303 个字符,预计需要花费 16 分钟才能阅读完成。

Bash

在 Bash 中,美元符号 $ 能够用于援用变量或者表达式的值。Bash 中的变量并不需要当时申明,而是在第一次赋值时主动创立。基于这个个性,咱们能够通过给变量名加上 $ 的形式来援用它的值,比方 $var 示意援用变量 var 的值。

在 Bash 中,应用 $ 还有其余一些常见的用法,例如:

  • $0:示意执行以后脚本的文件名,也就是脚本的第一个参数;
  • $1$2 等:示意脚本的第 1、2 个参数;
  • $#:示意传递给脚本的参数个数;
  • $?:示意上一个命令的返回值,在 Linux 零碎中,0 示意胜利,非零示意失败。

另外,Bash 中还反对一些特殊符号,例如:

  • $$:示意以后过程的过程 ID;
  • $!:示意最近一个后台作业(通过 & 运行的命令)的过程 ID;
  • $* 或 $@:示意所有传递给脚本的参数,区别在于前者将所有参数看成一个字符串,后者将每个参数视为独立的字符串。

除了以上用法之外,Bash 中还有很多其余的用法,例如用于替换命令行的通配符 $(),用于援用环境变量的 ${var},等等。总之,美元符号 $ 是 Bash 中一个十分重要的个性,把握好它的用法能够更加不便地编写脚本和命令行操作。

条件抉择、判断

条件抉择 if

if 判断条件 1 ; then

  条件为真的分支代码

elif 判断条件 2 ; then

  条件为真的分支代码

elif 判断条件 3 ; then

  条件为真的分支代码

else

  以上条件都为假的分支代码

fi
判断年龄
#!/bin/bash

read -p "请输出年龄:" age

# 判断 age 中是否蕴含非数字字符
if [["$age" =~ [^0-9]+ ]]; then
  echo "输出的年龄必须是数字"
  exit 1
fi

# 将 age 转换为数字,并判断范畴
if ((age < 18 || age > 150)); then
  echo "输出的年龄必须在 18 到 150 之间"
else
  echo "输出的年龄为 $age"
fi

条件判断  case

case $name in;

PART1)

  cmd
;;

PART2)

  cmd
 ;;
*)
  cmd
;;
esac
判断 yes or no
#!/bin/bash

read -p "请输出 yes 或 no:" answer

# 将 answer 转换为小写字母
answer=$(echo "$answer" | tr '[:upper:]' '[:lower:]')

# 判断输出是否为 "yes"
if [["$answer" = y || "$answer" = yes]]; then
  echo "输出为 yes"
# 判断输出是否为 "no"
elif [["$answer" = n || "$answer" = no]]; then
  echo "输出为 no"
else
  echo "无奈辨认输出"
fi
#!/bin/bash

echo "请输出 yes 或 no,能够答复 Y/y/yes/YES 或 N/n/no/NO:"
read answer

case "$answer" in
#正则:以大写或小写的 y 结尾,前面跟着大写或小写的 e,再前面跟着大写或小写的 s,组成的字符串。[Yy][Ee][Ss]|[Yy])
    echo "你答复的是 yes"
    ;;
  [Nn][Oo]|[Nn])
    echo "你答复的是 no"
    ;;
  *)
    echo "你的答复有效"
    ;;
esac

四个循环

for 循环

用法格局
for name in 列表 ;do

  循环体

done

for ((exp1; exp2; exp3)) ;do

  cmd

done
案例
求出(1+2+…+n)的总和
#!/bin/bash

# 读取用户输出的数字,判断是否为正整数
# `-ge`:是比拟运算符,示意“大于等于”的关系;# '-eq':是比拟运算符,示意“等于”的关系
while true
do
    read -p "请输出一个大于等于 1 的正整数:" num
    if [[$num =~ ^[0-9]+$ ]]; then
        if [$num -ge 1]; then
            break
        fi
    fi
done

# 初始化总和为 0
sum=0

# 应用一个 for 循环累加 1 到 num 的数字
for ((i=1;i<=num;i++))
do
    sum=$((sum+i))
done

# 输入后果
echo "1 到 $num 的数字之和为:$sum"

/***
以上代码中,咱们应用 while 循环不断读取用户输出的数字,判断其是否为正整数。如果用户输出了非数字字符,或者输出的数字小于 1,程序将提醒用户从新输出。当用户输出的数字符合要求时,程序才会继续执行。而后,代码和之前一样,应用 for 循环从 1 到 num 累加,并输入后果。留神,应用 `[[$num =~ ^[0-9]+$ ]]` 的正则表达式来验证用户输出是否为数字,其中 `^` 示意行的结尾,`$` 示意行的结尾,`[0-9]+` 示意数字呈现一次或屡次。在下面的代码中,咱们应用 `[$num -ge 1]` 条件表达式来判断用户输出的数字是否大于等于 1,如果成立,则符合要求,退出循环;否则,提醒用户从新输出。***/
求出 1-100 中所有奇数的和
#!/bin/bash

# 定义变量 sum,用于保留奇数和
sum=0

# 应用 for 循环顺次遍历 1 到 100 的数字
for ((i=1; i<=100; i++)); do
  # 判断以后数字是否为奇数,如果是则将其加到 sum 中去
  if [[$((i % 2)) -eq 1 ]]; then
    sum=$((sum + i))
  fi
done

# 输入后果
echo "1 到 100 中所有奇数的和为:$sum"

/***
首先,咱们定义了一个变量 sum,用于保留奇数和的后果。而后应用 for 循环遍历 1 到 100 的数字,每次循环查看以后数字是否为奇数,如果是则将其加到 sum 中。最初,应用 echo 输入后果。其中,`[[$((i % 2)) -eq 1 ]]` 是一个条件表达式,用于判断以后数字是否为奇数。`$((i % 2))` 示意取 i 对 2 取模的后果,如果这个后果为 1,则阐明 i 是奇数,条件表达式返回真;否则条件表达式返回假,不执行循环体中的语句。留神,上述程序中应用了双括号 `(())` 进行算术运算,比方 `sum=$((sum + i))` 示意将 sum 和 i 相加的后果赋值给 sum。另外,在 Bash 中,循环体必须用 `do` 和 `done` 关键字括起来,判断语句须要用 if 关键字结尾。***/

while 循环

用法格局
while 循环管制条件 ;do

  循环

done

循环管制条件;进入循环之前,先做一次判断;每一次循环之后会再次做判断;条件为“true”,则执行一次循环;直到条件测试状态为“false”终止循环 
非凡用法(遍历文件的每一行)
while read line; do 控制变量初始化

  循环体

done < /PATH/FROM/SOMEFILE

或 cat /PATH/FROM/SOMEFILE | while read line; do

  循环体

done

顺次读取 /PATH/FROM/SOMEFILE 文件中的每一行,且将行赋值给变量 line
案例 -100 以内所有正奇数之和
#!/bin/bash

sum=0
i=1

while [$i -le 100]
do
  read -p "请输出一个数:" num
  if [[! "$num" =~ ^[0-9]+$ ]]; then
    echo "输出谬误,请从新输出数字!"
  else
    if [$((num % 2)) -ne 0 ]; then
      sum=$((sum + num))
    fi
    i=$((i + 1))
  fi
done

echo "100 以内所有正奇数之和为:$sum"

/***
[[! "$num" =~ ^[0-9]+$ ]] 是一个 Bash 条件测试语句,用于判断 $num 是否为纯数字字符串。上面对其进行逐个解释:[[...]]:这是 Bash 特有的条件测试构造,其中 ... 就是待测试的条件表达式。!:逻辑非运算符,示意取相同值。"$num":将变量 $num 的值作为一个整体传递给条件测试命令。应用双引号能够确保 $num 中蕴含空格等特殊字符时仍然可能正确处理。=~:匹配运算符,用于测试是否合乎正则表达式。^[0-9]+$:正则表达式,示意整个字符串必须全副由数字组成。其中 ^ 示意匹配行首,[0-9]+ 示意匹配一或多个数字,$ 示意匹配行尾。因而,整个条件测试语句的含意能够了解为“如果 $num 不是由 1 个或多个数字组成,则返回真(即不符合条件)”。在条件测试中,如果条件为真,则返回 1;否则返回 0。因为上述条件语句中应用了逻辑非运算符 !,因而实际上示意的是 $num 为非纯数字字符串,如果符合条件,则返回真,否则返回假。因而,[[! "$num" =~ ^[0-9]+$ ]] 的含意是:如果 $num 不是纯数字字符串,则输入错误信息。***/

until 循环

用法格局
unitl 循环条件 a; do

  循环

done

进入条件:循环条件为 true;退出条件:循环条件为 false;刚好和 while 相同,所以不罕用,用 while 就行。
案例 - 监控 xiaoming 用户,登录就杀死
#!/bin/bash

# 定义被监控的用户名
TARGET_USER="xiaoming"

until who | grep -q $TARGET_USER; do
  sleep 0.5
done

# 当检测到用户登录时,kill 掉该用户的所有过程
pkill -u $TARGET_USER

# 退出脚本
exit 0

/***
上述脚本中,应用 `until` 循环对指标用户进行监控。其中 `who` 命令用于获取以后登录用户列表,`grep` 命令则用于匹配该用户是否存在于列表中。因为 `grep` 命令默认会输入匹配到的文本,因而须要应用 `-q` 选项来将输入屏蔽掉,从而只在匹配胜利时能力返回真。当检测到用户登录后,应用 `pkill` 命令杀死该用户的所有过程。最初,应用 `exit` 命令退出脚本。能够将上述脚本保留为文件,如 `monitor_user.sh`,而后应用 `chmod +x monitor_user.sh` 命令将其设置为可执行文件。运行该脚本后,它会每隔 0.5 秒扫描一次登录用户列表,直到发现 `xiaoming` 用户登录,之后就会杀死该用户的所有过程并退出脚本。***/

select 循环与菜单

用法格局
select variable in list

do

  循环体命令

done

① select 循环次要用于创立菜单,按数字顺序排列的示菜单项将显示在规范谬误上,并显示 PS3 提示符,期待用户输出

② 用户输出菜单列表中的某个数字,执行相应的命令

③ 用户输出被保留在内置变量 REPLY 中

④ select 是个有限循环,因而要记住用 break 命令退出循环,或用 exit 命令终止脚本。也能够按 ctrl+ c 退出循环

⑤ select 常常和 case 联结应用

⑥ 与 for 循环相似,能够省略 in list,此时应用地位参量 
案例
#!/bin/bash

# 定义菜单列表
menu=("面包 ¥2" "牛奶 ¥3" "咖啡 ¥5" "鸡蛋 ¥1" "退出")

# 显示菜单,直到用户抉择退出
while true; do
  # 输入菜单列表
  echo "请抉择要购买的商品(输出序号):"
  for i in "${!menu[@]}"; do
    echo "$((i+1))) ${menu[$i]}"
  done
  
  # 期待用户输出选项
  read -r choice
  if ["$choice" == "${#menu[@]}" ]; then
    # 如果抉择了最初一项 "退出",则退出循环
    echo "再见!"
    exit 0
  elif ["$choice" -gt 0] && ["$choice" -lt "${#menu[@]}" ]; then
    # 如果抉择了菜单中的某一项,则显示其价格并回到循环结尾
    item="${menu[$choice-1]}"
    price=$(echo "$item" | awk '{print $2}' | sed 's/¥//')
    echo "您抉择了:$item,价格为 $price 元。"
  else
    # 如果输出了有效的选项,则输入谬误提示信息并回到循环结尾
    echo "谬误的选项,请从新抉择!"
  fi
done


/***
在上述脚本中,首先定义了一个菜单列表 `menu`,其中每个菜品都附带有相应的价格。接着,应用 `PS3` 变量设置了 `select` 命令的提示符,这里设置为“请抉择要购买的商品(输出序号):”。而后,在一个有限循环中,应用 `select` 命令生成菜单,并期待用户抉择。当用户输出选项序号时,`select` 命令会将选项对应的值存储在 `$REPLY` 变量中。因为最初一项是退出选项,因而能够应用 `${#menu[@]}` 来获取菜单列表的长度,从而判断是否抉择了退出选项。如果抉择了退出,则输入“再见!”并应用 `exit` 命令退出脚本。如果抉择了菜单中的某一项,则应用 `echo` 命令显示该项内容,并通过 `break` 命令跳出以后循环,回到下层循环。如果输出了有效的选项,则也会输入谬误提示信息并间接回到循环结尾,期待用户从新输出。留神,在菜单列表中,每个菜品的价格都附带了人民币符号“¥”。因而,在输入选中的菜品价格时,须要对其进行截取和转换。能够应用 Bash 的字符串截取性能 `${item:(-1)}` 来提取字符串最初一位(即价格),而后再应用算术运算 `$((...))` 将其转换为数字类型,并除以 100 转换为元。例如,对于选中的菜品 ` 面包 ¥2`,能够应用以下代码来输入其价格:***/
九九乘法表
#!/bin/bash

for i in {1..9}; do
  for j in $(seq 1 $i); do
    # 计算并输入乘积
    result=$((i*j))
    printf "%dx%d=%-2d" $j $i $result
  done
  # 在每行的开端增加一个换行符
  echo ""
done

/***
- 咱们应用了 `seq` 命令来遍历每一行中的乘数。此命令会生成从 1 到 `$i` 的整数序列,其中 `$i` 是以后正在打印的乘数。- 在输入后果时,咱们应用了与之前雷同的 `printf` 命令,然而在格局字符串中减少了一个换行符。这样就能够使每个乘积占据独自一行,并减少输入后果的可读性。/***
黑白等腰三角形
#!/bin/bash

# 定义三角形高度和色彩数组
height=10
colors=("\033[31m" "\033[32m" "\033[33m" "\033[34m")

# 循环遍历每一行
for ((i=1; i<=$height; i++)); do

  # 计算所需填充的空格数量
  spaces=$((2*($height - $i) ))

  # 输入空格
  for ((j=1; j<=$spaces; j++)); do
    echo -n " "
  done

  # 计算所需填充的星号数量
  stars=$((2*i-1))

  # 输入星号
  for ((j=1; j<=$stars; j++)); do
    # 抉择色彩
    color=${colors[((i-1)%${#colors[@]})]}
    echo -en "$color* \033[0m"
  done

  # 换行
  echo ""
done

/***
在这个代码中,咱们定义了一个变量 `$height` 来指定三角形的高度,并定义了一个 `$colors` 数组来为三角形中的星号抉择不同的色彩。在循环中,咱们计算了所需的空格和星号数量,并应用 `echo -n` 输入适当数量的空格。对于星号,咱们也应用了一个循环来输入适当数量的星号,并应用 `$colors` 数组为每个星号抉择正确的色彩。最初,咱们应用 `echo ""` 来在每行开端输入一个换行,确保每行之间都有一个空白行。***/

举荐浏览:
https://mp.weixin.qq.com/s/dV2JzXfgjDdCmWRmE0glDA
https://mp.weixin.qq.com/s/an83QZOWXHqll3SGPYTL5g
举荐浏览:

https://mp.weixin.qq.com/s/dV2JzXfgjDdCmWRmE0glDA

https://mp.weixin.qq.com/s/an83QZOWXHqll3SGPYTL5g

正文完
 0