测试脚本学习--shell

一、简介

什么是脚本

本语言是像剧本一样教计算机办某个事情的语言。

比如你想让计算机执行复制某个文件的操作,如:cp ~/Desktop/*.txt ~/text

你可以在文本编辑器写入上边的代码并且保存此文件,然后你通过执行这个文本文件来执行上面的代码,并不需要重复手动输入上边的代码。

所以脚本其实就是短小的、用来让计算机自动化完成一系列工作的程序,这类程序可以用文本编辑器修改,不需要编译,通常是解释运行的。

shell种类

  • sh(全称 Bourne Shell)
    是UNIX最初使用的 shell,而且在每种 UNIX 上都可以使用。

    Bourne Shell 在 shell 编程方面相当优秀,但在处理与用户的交互方面做得不如其他几种 shell。

  • bash(全称 Bourne Again Shell): LinuxOS 默认的,它是 Bourne Shell 的扩展。 与 Bourne Shell 完全兼容,并且在 Bourne Shell 的基础上增加了很多特性。可以提供命令补全,命令编辑和命令历史等功能。它还包含了很多 C Shell 和 Korn Shell 中的优点,有灵活和强大的编辑接口,同时又很友好的用户界面。

  • csh(全称 C Shell): 是一种比 Bourne Shell更适合的变种 Shell,它的语法与 C 语言很相似。

  • Tcsh: 是 Linux 提供的 C Shell 的一个扩展版本。
    Tcsh 包括命令行编辑,可编程单词补全,拼写校正,历史命令替换,作业控制和类似 C 语言的语法,他不仅和 Bash Shell 提示符兼容,而且还提供比 Bash Shell 更多的提示符参数。

  • ksh (全称 Korn Shell): 集合了 C Shell 和 Bourne Shell 的优点并且和 Bourne Shell 完全兼容。

  • pdksh: 是 Linux 系统提供的 ksh 的扩展。
    pdksh 支持人物控制,可以在命令行上挂起,后台执行,唤醒或终止程序。

什么是shell

Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。

Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。

Ken Thompson 的 sh 是第一种 Unix Shell,Windows Explorer 是一个典型的图形界面 Shell

由于习惯的原因,简洁起见,本文出现的 “shell编程” 都是指 shell 脚本编程,不是指开发 shell 自身

#! 告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序

脚本测试

https://www.runoob.com/try/runcode.php?filename=helloworld&type=bash

二、变量

规则:

  • 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
  • 中间不能有空格,可以使用下划线(_)。
  • 不能使用标点符号。
  • 不能使用bash里的关键字(可用help命令查看保留关键字类型:

类型:

局部变量、环境变量、shell变量(由shell程序设置的特殊变量,一部分是环境另一部分是局部保证了shell正常运行)

使用变量

your="jkl"
echo $your
echo ${your}kkkk #可以跟其他的连在一起

your="5555"
uo="5454"
echo ${your}${uo}

只读变量

只有读取权限没有修改权限

#!/bin/bash
myurl="https://www.google.com"
readonly myurl
myurl="5555" #error

删除变量

url="555"
kl="58"
unset url
etho ${kl}${555}

shell字符串

单引号
str='jjjj  sad'#单引号里任何字符都会原样输出,串里变量无效
双引号

内部可以有变量,可以出现转义字符

str="Hello ,iknow you era \"$your\"! \n"
echo $str
拼接字符串(单双都行)
greeting="hello, "$your" !"
greeting_1="hello, ${your} !"
echo $greeting  $greeting_1


#hello, 5555 ! hello, 5555 !
获取字符串长度
your="55555"
echo ${#your}
#输出4
提取字符串
string="sggshg g ss klk "
echo ${string:1:9} #从第一个字符开始截取9个字符

三、运行shell脚本步骤

#!  是一个约定标记,告诉系统这个脚本需要什么解释器运行(使用哪一种shell)

作为可执行程序

chmod +x ./download.sh#使脚本具有执行权限
./download.sh #执行脚本

作为解释器参数

/bin/sh test.sh
/bin/php test.sh

另外一种

#进入脚本目录
sh test.sh

四、shell数组

shell只支持一维数组

定义方式

可以使用不连续下标,下标没有范围

arry=(value0 value2)
echo $arry[@] #打印数组内所有元素
length=${#arry[@]}
# 取得数组元素的个数
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得数组单个元素的长度
lengthn=${#array_name[n]}

读取方式

arry=(b1 b3 b4)

echo ${arry[0]}

五、注释

# 开头的行就是注释,会被解释器忽略。

通过每一行加一个 # 号设置多行注释,像这样:

#--------------------------------------------
# 这是一个注释
# author:菜鸟教程
# site:www.runoob.com
# slogan:学的不仅是技术,更是梦想!
#--------------------------------------------
##### 用户配置区 开始 #####
#
#
# 这里可以添加脚本描述信息
# 
#
##### 用户配置区 结束  #####

如果在开发过程中,遇到大段的代码需要临时注释起来,过一会儿又取消注释,怎么办呢?

每一行加个#符号太费力了,可以把这一段要注释的代码用一对花括号括起来,定义成一个函数,没有地方调用这个函数,这块代码就不会执行,达到了和注释一样的效果。

多行注释

多行注释还可以使用以下格式:

:<<EOF
注释内容...
注释内容...
注释内容...
EOF

EOF 也可以使用其他符号:

:<<'
注释内容...
注释内容...
注释内容...
'

:<<!
注释内容...
注释内容...
注释内容...
!

六、向shell传递参数

echo "first is $0";
echo "second is $1";
echo "third is $2";
echo "total is $#"
echo "$$"
echo "$*"

运行结果

[root@localhost Desktop]# sh test.sh 0 1 2
first is test.sh
second is 0
third is 1
total is 3
2964
0 1 2
[root@localhost Desktop]# sh test.sh 0 1 
first is test.sh
second is 0
third is 1
total is 2
2965
0 1
[root@localhost Desktop]# sh test.sh 0 
first is test.sh
second is 0
third is 
total is 1
2968
0

参数处理说明
$#传递到脚本的参数个数
$*以一个单字符串显示所有向脚本传递的参数。 如"$*“用「”」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
$$脚本运行的当前进程ID号
$!后台运行的最后一个进程的ID号
$@ ∗ 相 同 , 但 是 使 用 时 加 引 号 , 并 在 引 号 中 返 回 每 个 参 数 。 如 " *相同,但是使用时加引号,并在引号中返回每个参数。 如" 使"@“用「”」括起来的情况、以"$1" “ 2 " … " 2" … " 2""n” 的形式输出所有参数。
$-显示Shell使用的当前选项,与set命令功能相同。
$?显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误

@ 与 @与 @*区别:单引号区别,换不换行

#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com

echo "-- \$* 演示 ---"
for i in "$*"; do
    echo $i
done

echo "-- \$@ 演示 ---"
for i in "$@"; do
    echo $i
done

执行脚本,输出结果如下所示:

$ chmod +x test.sh 
$ ./test.sh 1 2 3
-- $* 演示 ---
1 2 3
-- $@ 演示 ---
1
2
3

七、基本运算符

算术运算符、关系运算符、布尔运算符、字符串运算符、文件测试运算符

算术运算符

不多赘述

val=`expr 2 + 2`
echo "两数之和为 : $val"
#记得使用反引号,tab上面

关系运算符

if [ $a -eq $b ]
then
   echo "$a -eq $b : a 等于 b"
else
   echo "$a -eq $b: a 不等于 b"
eq检测两个数是否相等,相等返回 true。[ $a -eq $b ] 返回 false。
-ne检测两个数是否不相等,不相等返回 true。[ $a -ne $b ] 返回 true。
-gt检测左边的数是否大于右边的,如果是,则返回 true。[ $a -gt $b ] 返回 false。
-lt检测左边的数是否小于右边的,如果是,则返回 true。[ $a -lt $b ] 返回 true。
-ge检测左边的数是否大于等于右边的,如果是,则返回 true。[ $a -ge $b ] 返回 false。
-le检测左边的数是否小于等于右边的,如果是,则返回 true。[ $a -le $b ] 返回 true。

布尔运算符

!非运算,表达式为 true 则返回 false,否则返回 true。[ ! false ] 返回 true。
-o或运算,有一个表达式为 true 则返回 true。[ $a -lt 20 -o $b -gt 100 ] 返回 true。
-a与运算,两个表达式都为 true 才返回 true。[ $a -lt 20 -a $b -gt 100 ] 返回 false。

逻辑运算符

&&与||,逻辑and和逻辑or

字符串运算

=检测两个字符串是否相等,相等返回 true。[ $a = $b ] 返回 false。
!=检测两个字符串是否相等,不相等返回 true。[ $a != $b ] 返回 true。
-z检测字符串长度是否为0,为0返回 true。[ -z $a ] 返回 false。
-n检测字符串长度是否不为 0,不为 0 返回 true。[ -n “$a” ] 返回 true。
$检测字符串是否为空,不为空返回 true。[ $a ] 返回 true。

文件测试运算符

-b file检测文件是否是块设备文件,如果是,则返回 true。[ -b $file ] 返回 false。
-c file检测文件是否是字符设备文件,如果是,则返回 true。[ -c $file ] 返回 false。
-d file检测文件是否是目录,如果是,则返回 true。[ -d $file ] 返回 false。
-f file检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。[ -f $file ] 返回 true。
-g file检测文件是否设置了 SGID 位,如果是,则返回 true。[ -g $file ] 返回 false。
-k file检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。[ -k $file ] 返回 false。
-p file检测文件是否是有名管道,如果是,则返回 true。[ -p $file ] 返回 false。
-u file检测文件是否设置了 SUID 位,如果是,则返回 true。[ -u $file ] 返回 false。
-r file检测文件是否可读,如果是,则返回 true。[ -r $file ] 返回 true。
-w file检测文件是否可写,如果是,则返回 true。[ -w $file ] 返回 true。
-x file检测文件是否可执行,如果是,则返回 true。[ -x $file ] 返回 true。
-s file检测文件是否为空(文件大小是否大于0),不为空返回 true。[ -s $file ] 返回 true。
-e file检测文件(包括目录)是否存在,如果是,则返回 true。[ -e $file ] 返回 true。
file ="/home/prince/Desktop/test.sh"
if [-w file]
then
  echo "can read"
else
  echo "canot read"
fi

八、echo命令

注意有些命令不是单引号是反引号```````````

显示变量读取

#!/bin/sh
read name
echo "$name it is test"
#read命令可以从terminal中读取你输入的一行,并把该字段指定给shell变量

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6HEiKr1H-1618985183120)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210130132945250.png)]

显示结果定向到一个文件

将显示结果定向到当前目录(未指定位置)的文件内,没有就新建,有就复写

echo `date`
read name
echo "$name it is a test" > myfile

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fkqAjADb-1618985183122)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210130133559141.png)]

​ 能否引用变量 | 能否引用转移符 | 能否引用文本格式符(换行符等)

单引号 | 否 | 否 | 否

双引号 | 能 | 能 | 能

无引号 | 能 | 能 | 否

九、printf命令

printf 命令模仿 C 程序库(library)里的 printf() 程序。

printf 由 POSIX 标准所定义,因此使用 printf 的脚本比使用 echo 移植性好。

printf 使用引用文本或空格分隔的参数,外面可以在 printf 中使用格式化字符串,还可以制定字符串的宽度、左右对齐方式等。默认 printf 不会像 echo 自动添加换行符,我们可以手动添加 \n。

printf参考C语言的用法查看下面语句

printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg  
printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234
printf "%-10s %-8s %-4.2f\n" 杨过 男 48.6543
printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876

#姓名     性别   体重kg
#郭靖     男      66.12
#杨过     男      48.65
#郭芙     女      47.99
\a警告字符,通常为ASCII的BEL字符
\b后退
\c抑制(不显示)输出结果中任何结尾的换行字符(只在%b格式指示符控制下的参数字符串中有效),而且,任何留在参数里的字符、任何接下来的参数以及任何留在格式字符串中的字符,都被忽略
\f换页(formfeed)
\n换行
\r回车(Carriage return)
\t水平制表符
\v垂直制表符
\一个字面上的反斜杠字符
\ddd表示1到3位数八进制值的字符。仅在格式字符串中有效
\0ddd表示1到3位的八进制值字符

十、test命令

专门用来检查某个条件是否成立

数值测试
参数说明
-eq等于则为真
-ne不等于则为真
-gt大于则为真
-ge大于等于则为真
-lt小于则为真
-le小于等于则为真
#!/bin/bash
if test $[num1] -eq $[num2]
then 
echo '='
else
echo '!='
fi
字符串测试
=等于则为真
!=不相等则为真
-z 字符串字符串的长度为零则为真
-n 字符串字符串的长度不为零则为真
num1="sdadsasd"
num2="45"
if test $[num1] = $[num2]
then 
echo '='
else
echo '!='
fi
文件测试
-e 文件名如果文件存在则为真
-r 文件名如果文件存在且可读则为真
-w 文件名如果文件存在且可写则为真
-x 文件名如果文件存在且可执行则为真
-s 文件名如果文件存在且至少有一个字符则为真
-d 文件名如果文件存在且为目录则为真
-f 文件名如果文件存在且为普通文件则为真
-c 文件名如果文件存在且为字符型特殊文件则为真
-b 文件名如果文件存在且为块特殊文件则为真
cd /bin
if test -e ./bash
then
    echo '文件已存在!'
else
    echo '文件不存在!'
fi

十一、流程控制

在sh/bash里可不能这么写,如果else分支没有语句执行,就不要写这个else

if语句

if设置

if condition
then
    command1 
    command2
    ...
    commandN 
fi

if else设置

if condition
then
    command1 
    command2
    ...
    commandN
else
    command
fi

if else-if else设置

if condition1
then
    command1
elif condition2 
then 
    command2
else
    commandN
fi

循环

for循环
for var in item1 item2 ... itemN
do
    command1
    command2
    ...
    commandN
done

实例

for loop in 1 2 3 4 5
do
    echo "The value is: $loop"
done

#The value is: 1
#The value is: 2
#The value is: 3
#The value is: 4
#The value is: 5
while命令
while condition
do
    command
done

实例

#!/bin/bash
int=1
while(( $int<=5 ))
do
    echo $int
    let "int++"
done

#1
#2
#3
#4
#5
无限(死)循环
while :
do
    command
done
for((;;))
until循环

until 循环执行一系列命令直至条件为 true 时停止。

until 循环与 while 循环在处理方式上刚好相反。

一般 while 循环优于 until 循环,但在某些时候—也只是极少数情况下,until 循环更加有用。

until 语法格式:

until condition
do
    command
done
a=0
until [! $a -lt 10]
do 
echo $a
a=`expr $a + 1`
done

case多选择语句

一个case匹配一个值和模式,匹配成功执行相应命令

casein
模式1)
    command1
    command2
    ...
    commandN
    ;;
模式2)
    command1
    command2
    ...
    commandN
    ;;
esac
#!/bin/bash
while :
do
    echo -n "输入 1 到 5 之间的数字:"
    read aNum
    case $aNum in
        1|2|3|4|5) echo "你输入的数字为 $aNum!"
        ;;
        *) echo "你输入的数字不是 1 到 5 之间的! 游戏结束"
            break
        ;;
    esac
done

跳出循环

break跳出所有循环

continue跳出当前循环

while 循环在处理方式上刚好相反。

一般 while 循环优于 until 循环,但在某些时候—也只是极少数情况下,until 循环更加有用。

until 语法格式:

until condition
do
    command
done
a=0
until [! $a -lt 10]
do 
echo $a
a=`expr $a + 1`
done

case多选择语句

一个case匹配一个值和模式,匹配成功执行相应命令

casein
模式1)
    command1
    command2
    ...
    commandN
    ;;
模式2)
    command1
    command2
    ...
    commandN
    ;;
esac
#!/bin/bash
while :
do
    echo -n "输入 1 到 5 之间的数字:"
    read aNum
    case $aNum in
        1|2|3|4|5) echo "你输入的数字为 $aNum!"
        ;;
        *) echo "你输入的数字不是 1 到 5 之间的! 游戏结束"
            break
        ;;
    esac
done

跳出循环

break跳出所有循环

continue跳出当前循环

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UdUpAnQg-1618985183123)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210302200405462.png)]

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Ubuntu中,可以使用shell脚本进行各种软件的自动部署和其他任务。你可以编写一个适配Ubuntu 18.04的shell脚本来实现这些功能。通过shell脚本,你可以在Ubuntu开机自动启动一些特定的任务或应用程序。你可以参考一些相关的教程和文档来学习如何编写和配置这些shell脚本。其中一篇详细介绍在Ubuntu中编写shell脚本开机自动启动的文章,可以给你提供一些参考和借鉴价值。另外,还有一些其他的shell脚本可以帮助你在Ubuntu下进行配置和操作,比如配置右键菜单的脚本。通过这些脚本,你可以更加方便地进行一些常用的操作和配置。希望这些信息能对你有所帮助。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [script-apt:ubuntu18.04 shell脚本,支持各种软件的自动部署](https://download.csdn.net/download/weixin_42099942/15631015)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [ubuntu中编写shell脚本开机自动启动(推荐)](https://download.csdn.net/download/weixin_38641366/12841566)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [ubuntu的右键shell脚本.zip](https://download.csdn.net/download/oooreadooo/12355574)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值