到那里找做网站的兼职,谷歌浏览器对做网站有什么好处,太原工程建设招投标信息网站,网页设计与网站建设实训报告shell是一个用 C 语言编写的程序#xff0c;它是用户使用 Linux 的桥梁。Shell 既是一种命令语言#xff0c;又是一种程序设计语言。 Shell 是指一种应用程序#xff0c;这个应用程序提供了一个界面#xff0c;用户通过这个界面访问操作系统内核的服务。 Shell属于内置的… shell是一个用 C 语言编写的程序它是用户使用 Linux 的桥梁。Shell 既是一种命令语言又是一种程序设计语言。 Shell 是指一种应用程序这个应用程序提供了一个界面用户通过这个界面访问操作系统内核的服务。 Shell属于内置的脚本程序开发的效率非常高依赖于功能强大的命令可以迅速地完成开发任务批处理语法简单代码写起来比较轻松简单易学 Shell是一个命令行解释器它接收应用程序/用户命令然后调用操作系统内核。 Shell还是一个功能相当强大的编程语言易编写易调试灵活性强。 脚本以 #!/bin/bash 开头指定解析器第二行进行脚本的编写。 目录 shell分类编写规范文件命名规范Bash 常用快捷键输入输出重定向输入重定向输出重定向/dev/null 文件多命令顺序执行 shell脚本的执行第一种给文件增加执行权限方式执行shell脚本第二种了解通过Bash调用执行脚本方式执行shell脚本 入门案例1.编写shell脚本2.脚本执行方式 shell变量系统预定义变量示例查看系统变量的值全局echo $HOME 查看系统全局变量env显示当前Shell中的所有变量set 环境变量设置环境变量环境变量查询和删除系统默认环境变量 位置参数变量预定义变量“$?”“$ ” 和 “ ”和“ ”和“!” 用户自定义变量基本语法变量定义规则变量定义变量调用变量查看变量删除示例 变量的四种引用方式shell中特殊符号单引号和双引号反引号 只读变量接受键盘输入示例 Shell运算符算数运算符关系运算符示例判断当前输入的用户是否存在。如果存在则提示“用户存在”否则提示“用户不存在”。 逻辑运算符字符串运算符文件测试运算符重点 shell分类
cat /etc/shells在linux中有很多类型的shell不同的shell具备不同的功能shell还决定了脚本中函数的语法Linux中默认的shell是 / b a s h / b a s h 重 点 流行的shell有ash、bash、ksh、csh、zsh等不同的shell都有自己的特点以及用途。 查看Shell默认的解析器是bash echo $SHELL编写规范
#!/bin/bash [指定告知系统当前这个脚本要使用的shell解释器]
Shell相关指令文件命名规范
文件名.sh .sh是linux下bash shell 的默认后缀Bash 常用快捷键 输入输出重定向 输入重定向
是指不使用系统提供的标准输入端口而进行重新的指定。换言之输入重定向就是不使用标准输入端口输入文件而是使用指定的文件作为标准输入设备。重定向简单理解就是使用 “”符来修改标准输入设备
输出重定向
通俗的讲重定向输出就是把要输出的文件信息写入到一个文件中去而不是将要输出的文件信息输出到控制台显示屏在linux中默认的标准输出设备是控制台或称为显示器,用户输出的信息默认情况下都会显示到控制台
表示全部文件文件不管对错1表示标准输出文件2表示标准错误输出。
/dev/null 文件
如果希望执行某个命令但又不希望在屏幕上显示输出结果那么可以将输出重定向到 /dev/null 中
[rootlocalhost ~]$ command dev/null多命令顺序执行 shell脚本的执行
[rootlocalhost ~]$ vim test.sh
#!/bin/bash
echo “hello world”第一种给文件增加执行权限方式执行shell脚本
[rootlocalhost ~]$ chmod ux test.sh
[rootlocalhost ~]$ ./test.sh #绝对路径或相对路径执行第二种了解通过Bash调用执行脚本方式执行shell脚本
[rootlocalhost ~]$ bash test.sh入门案例
1.编写shell脚本 创建目录用于存放shell脚本文件 mkdir scripts
cd scripts/使用vim命令创建xxx.sh文件 vim hello.sh编写xxx.sh文件内容第一行#!/bin/bash第二行开始编写脚本代码 #!/bin/bash
echo hello,world2.脚本执行方式 bash执行方式bash hello.sh sh执行方式sh hello.sh 添加权限执行chmod x hello.sh # xxx.sh文件添加可执行权限
chmod x xxx.sh
# xxx.sh文件当前用户添加可执行权限
chmod ax xxx.sh
# 最高权限
chmod 777 xxx.sh当前路径相对路径执行 ././hello.sh 绝对路径执行/root/scripts/hello.sh source执行脚本source hello.sh、source /root/scripts/hello.sh . 执行脚本. hello.sh
shell变量
在一个脚本周期内,其值可以发生改变的量就是变量。分类如下
用户自定义变量: 这种变量是最常见的变量由用户自由定义变量名和变量的值。环境变量: 这种变量中主要保存的是和系统操作环境相关的数据比如当前登录用户用户的家目录命令的提示符等。不是太好理解吧那么大家还记得在Windows中同一台电脑可以有多个用户登录而且每个用户都可以定义自己的桌面样式和分辨率这些其实就是Windows的操作环境可以当做是Windows的环境变量来理解。环境变量的变量名可以自由定义但是一般对系统起作用的环境变量的变量名是系统预先设定好的。位置参数变量: 这种变量主要是用来向脚本当中传递参数或数据的变量名不能自定义变量作用是固定的。预定义变量: 是Bash中已经定义好的变量变量名不能自定义变量作用也是固定的。
系统预定义变量
常用系统变量 $ HOME、$ PWD、$ SHELL、$ USER等环境变量 export查看环境变量echo $PATH输出环境变量的值help echo查看echo命令的帮助信息
示例
查看系统变量的值全局echo $HOME 查看系统全局变量env 显示当前Shell中的所有变量set
环境变量
设置环境变量
[rootlocalhost ~]$ export age18
#使用export声明的变量即是环境变量环境变量查询和删除
env命令和set命令的区别set命令可以查看所有变量而env命令只能查看环境变量。
[rootlocalhost ~]$ unset gender #删除环境变量gender
[rootlocalhost ~]$ env | grep gender系统默认环境变量
[rootlocalhost ~]$ env
HOSTNAMElocalhost.localdomain #主机名
SHELL/bin/bash #当前的shell
TERMlinux #终端环境
HISTSIZE1000 #历史命令条数
SSH_CLIENT192.168.4.1594824 22 #当前操作环境是用ssh连接的这里记录客户端ip
SSH_TTY/dev/pts/1 #ssh连接的终端时pts/1
USERroot #当前登录的用户
..........更多参数可以使用set和env命令查看.............位置参数变量
位置参数变量作用$nn为数字$0表示当前 Shell 脚本程序的名称$1- 9 代 表 第 一 到 第 九 个 参 数 , 如 9代表第一到第九个参数,十以上的参数需要用大括号包含如{10}$*这个变量代表命令行中所有的参数$把所有的参数看成一个整体$这个变量也代表命令行中所有的参数不过$把每个参数区分对待$#这个变量代表命令行中所有参数的个数
$1 是你给你写的shell脚本传的第一个参数$2 是你给你写的shell脚本传的第二个参数…
[rootlocalhost sh]$ vim test.sh
#!/bin/sh
echo shell脚本本身的名字: $0
echo 传给shell的第一个参数: $1
echo 传给shell的第二个参数: $2∗ 会 把 接 收 的 所 有 参 数 当 成 一 个 整 体 对 待 而 *会把接收的所有参数当成一个整体对待而 ∗会把接收的所有参数当成一个整体对待而则会区分对待接收到的所有参数。举个例子:
[rootlocalhost sh]$ vi parameter2.sh
#!/bin/bash
for i in$*
#定义for循环in后面有几个值for会循环多少次注意“$*”要用双引号括起来
#每次循环会把in后面的值赋予变量i
#Shell把$*中的所有参数看成是一个整体所以这个for循环只会循环一次doecho The parameters is: $i#打印变量$i的值done
x1
#定义变量x的值为1
for y in$
#同样in后面的有几个值for循环几次每次都把值赋予变量y
#可是Shel1中把“$”中的每个参数都看成是独立的所以“$”中有几个参数就会循环几次doecho The parameter$x is: $y#输出变量y的值x$(( $x 1 ))#然变量x每次循环都加1为了输出时看的更清楚done预定义变量
预定义变量作用$?最后一次执行的命令的返回状态。如果这个变量的值为0证明上一个命令正确执行;如果这个变量的值为非О(具体是哪个数由命令自己来决定则证明上一个命令执行不正确了。$$当前进程的进程号PID)$!后台运行的最后一个进程的进程号(PID)
“$?”
[rootlocalhost sh]$ ls
count.sh hello.sh parameter2.sh parameter.sh
#ls命令正确执行
[rootlocalhost sh]$ echo $?
#预定义变量“$?”的值是0证明上一个命令执行正确
[rootlocalhost sh]$ ls install.log
ls:无法访问install.log:没有那个文件或目录
#当前目录中没有install.log文件所以ls命令报错了
[rootlocalhost sh]$ echo $?
2
#变量“$?”返回一个非О的值证明上一个命令没有正确执行
#至于错误的返回值到底是多少是在编写ls命令时定义好的如果碰到文件不存在就返回数值2“$ ” 和 “ ”和“ ”和“!”
[rootlocalhost sh]$ vi variable.sh #!/bin/bash echo “The current process is $$” #输出当前进程的PID. #这个PID就是variable.sh这个脚本执行时生成的进程的PID find /root -name hello.sh #使用find命令在root目录下查找hello.sh文件 #符号的意思是把命令放入后台执行工作管理我们在系统管理章节会详细介绍 echo “The last one Daemon process is $!” #输出这个后台执行命令的进程的PID也就是输出find命令的PID号
用户自定义变量
基本语法
定义变量变量赋值变量名变量值注意前后不能有空格销毁变量unset 变量声明静态变量readonly 变量注意不能销毁unset
变量定义规则 命名只能使用英文字母数字和下划线首个字符不能以数字开头。 不能使用标点符号不能使用bash里的关键字可用help命令查看保留关键字。 环境变量建议大写便于区分 如果需要增加变量的值那么可以进行变量值的叠加。不过变量需要用双引号包含 变 量 名 或 用 变量名或用 变量名或用{变量名}包含变量名。 在bash中变量默认类型都是字符串类型无法直接进行数值运算。 局部变量变成全局变量使用export 子shell更改不会影响父shell typeset和declare两个内部命令定义变量 等号左右两侧不能有空格。变量的值如果有空格需要使用双引号或单引号括起来如:“test“hello world!””。其中双引号括起来的内容“$”“(”和反引号都拥有特殊含义而单引号括起来的内容都是普通字符: echo “hello ${x}”双引号可以正常输出变量值echo ‘hello ${x}’单引号输出字符串
变量定义
[rootlocalhost ~]$ 2namezhang san
-bash: 2namezhang san: command not found
#变量名不能用数字开头
[rootlocalhost ~]$ name zhangsan
-bash: name: command not found
#等号左右两侧不能有空格
[rootlocalhost ~]$ namezhang san
-bash: san: command not found
#变量的值如果有空格必须用引号包含变量调用
[rootlocalhost ~]$ namezhang san
#定义变量name
[rootlocalhost ~]$ echo $name #调用变量使用 $变量名
zhang san
#输出变量name的值变量查看
[rootlocalhost ~]$ set [选项]
选项:
-u:如果设定此选项调用未声明变量时会报错默认无任何提示
-x:如果设定此选项在命令执行之前会把命令先输出一次
参数 :取消某个set曾启动的参数。[rootlocalhost ~]$ set
BASH/bin/bash
…省略部分输出…
nameshen chao
#直接使用set 命令会查询系统中所有的变量包含用户自定义变量和环境变量
[rootlocalhost ~]$ set -u
[rootlocalhost ~]$ echo $file
-bash: file: unbound variable
#当设置了-u选项后如果调用没有设定的变量会有报错。默认是没有任何输出的。
[rootlocalhost ~]$ set -x
[rootlocalhost ~]$ ls
ls --colorauto
anaconda-ks.cfginstall.loginstall.log.syslog sh tdir testtestfile
#如果设定了-x选项会在每个命令执行之前先把命令输出一次[rootlocalhost ~]$ set x
#取消启动的x参数变量删除
[rootlocalhost ~]$ unset 变量名示例
test123
test$test456
echo $test
#输出123456
#叠加变量test变量值变成了123456
test${test}789
echo $test
#输出123456789
#再叠加变量test变量值编程了123456789变量的四种引用方式
$变量名${变量名}“$变量名”“${变量名}”
shell中特殊符号 单引号和双引号
namezjl
#定义变量name 的值是zjl
echo $name
#输出$name
#如果输出时使用单引号则$name原封不动的输出
echo $name
#输出zjl
#如果输出时使用双引号则会输出变量name的值 scecho date
#输出2024年 03月 11日 星期一 11:30:43 CST
#反引号括起来的命令会正常执行
[rootlocalhost ~]$ echo date
date
#但是如果反引号命令被单引号括起来那么这个命令不会执行―date会被当成普通字符输出
[rootlocalhost ~]$ echo date
输出2024年 03月 11日 星期一 11:31:38 CST
#如果是双引号括起来那么这个命令又会正常执行反引号
echo ls
#输出ls
#如果命令不用反引号包含命令不会执行而是直接输出
echo ls
#会报错 未找到命令
#只有用反引号包括命令这个命令才会执行
echo $(date)
#输出2024年 03月 11日 星期一 11:44:36 CST
#使用$(命令)的方式也是可以的只读变量 [rootlocalhost sh]$ vi readonly.sh
#!/bin/bash
a10
#语法readonly 变量名
readonly a
a20 #会报错readonly variable
echo $a接受键盘输入
[rootlocalhost ~]$ read [选项][变量名]
选项:-a 后跟一个变量该变量会被认为是个数组然后给其赋值默认是以空格为分割符。-p “提示信息”在等待read输入时输出提示信息-t 秒数read命令会一直等待用户输入使用此选项可以指定等待时间-n 数字read命令只接受指定的字符数就会执行-s 隐藏输入的数据适用于机密信息的输入-d 后面跟一个标志符其实只有其后的第一个字符有用作为结束的标志。-e 在输入的时候可以使用命令补全功能。变量名: 变量名可以自定义如果不指定变量名会把输入保存入默认变量REPLY. 如果只提供了一个变量名则整个输入行赋予该变量. 如果提供了一个以上的变量名则输入行分为若干字一个接一个地赋予各个变量而命令行上的最后一个变量取得剩余的所有字
示例
[rootlocalhost sh]$ vi read.sh
#!/bin/bash
read -t 30 -p Please input your name: name
#提示“请输入姓名”并等待30 秒把用户的输入保存入变量name 中
echo Name is $name
#看看变量“$name”中是否保存了你的输入read -s -t 30 -p Please enter your age: age
#提示“请输入年龄”并等待30秒把用户的输入保存入变量age中
#年龄是隐私所以我们用“-s”选项隐藏输入
echo -e \n
#调整输出格式如果不输出换行一会的年龄输出不会换行
echo Age is $ageread -n 1 -t 30 -p Please select your gender[M/F]: gender
#提示“请选择性别”并等待30秒把用户的输入保存入变量gender
#使用“-n1”选项只接收一个输入字符就会执行都不用输入回车
echo -e \n
echo Sex is $genderShell运算符
在shell中运算符和其他编程脚本语言一样常见的有算数运算符、关系运算符、逻辑运算符、字符串运算符、文件测试运算符等
算数运算符
原生bash不支持简单的数学运算但是可以通过其他命令来实现例如 awk 和 exprexpr 最常用。 expr 是一款表达式计算工具使用它能完成表达式的求值操作。例如两个数相加(注意使用的是反引号 而不是单引号 )
[rootlocalhost ~]$ vi computer.sh
#!/bin/bash
valexpr 2 2
echo 两数之和为 : $val
#注意
#表达式和运算符之间要有空格例如 22 是不对的必须写成 2 2这与我们熟悉的大多数编程语言不一样。
#完整的表达式要被 包含注意这个字符不是常用的单引号在 Esc 键下边。假定变量 a 为 10变量 b 为 20
运算符说明举例加法expr $a $b 结果为 30。-减法expr $a - $b 结果为 -10。*乘法expr $a * $b 结果为 200。/除法expr $b / $a 结果为 2。%取余expr $b % $a 结果为 0。赋值a$b 将把变量 b 的值赋给 a。相等。用于比较两个数字相同则返回 true真。[ $a $b ] 返回 false假。!不相等。用于比较两个数字不相同则返回 true。[ $a ! $b ] 返回 true。
注意条件表达式要放在方括号之间并且要有空格必须写成 [ $a $b ]。
[rootlocalhost ~]$ vi computers.sh
#!/bin/bash
a10
b20
echo
echo ab expr $a $b
echo a-b expr $a - $b
echo a*b expr $a \* $b
echo a/b expr $a / $b
echo a%b expr $a % $b#判断是否相等
if [ $a $b ]
thenecho a等于b
elseecho a不等于b
fi关系运算符
关系运算符只支持数字不支持字符串除非字符串的值是数字。
运算符单词说明举例-eqequal检测两个数是否相等相等返回 true。[ $a -eq $b ] 返回 false。-nenot equal检测两个数是否相等不相等返回 true。[ $a -ne $b ] 返回 true。-gtgreat than检测左边的数是否大于右边的如果是则返回 true。[ $a -gt $b ] 返回 false。-ltless than检测左边的数是否小于右边的如果是则返回 true。[ $a -lt $b ] 返回 true。-gegreat than or equal检测左边的数是否大于等于右边的如果是则返回 true。[ $a -ge $b ] 返回 false。-leless than or equal检测左边的数是否小于等于右边的如果是则返回 true。[ $a -le $b ] 返回 true。
[rootlocalhost ~]$ [ 10 -gt 10 ]
[rootlocalhost ~]$ echo $? 1
[rootlocalhost ~]$ [ 10 -eq 10 ]
[rootlocalhost ~]$ echo $? 0示例判断当前输入的用户是否存在。如果存在则提示“用户存在”否则提示“用户不存在”。
如果要在shell脚本使用linux命令可以使用$()包裹命令。例如
disk_size$(df -h | awk ‘NR2 {print $5}’)[rootlocalhost ~]$ vim demo.sh
#!/bin/bash
#接受用户的输入
read -p 请输入需要查询的用户名: username#获取指定用户名在passwd文件中出现的次数
count$(cat /etc/passwd | grep $username | wc -l)
#countcat /etc/passwd | grep $username | wc -l#判断出现的次数如果次数0则用户不存在反之存在
if [ $count 0 ]
then echo 用户不存在else echo 用户存在
fi逻辑运算符
运算符说明举例!非运算表达式为 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。
或运算一个为真即为真全部为假才是假与运算一个为假即为假全部为真才是真
字符串运算符
假定变量 a 为 “abc”变量 b 为 “efg”
运算符说明举例检测两个字符串是否相等相等返回 true。[ $a $b ] 返回 false。!检测两个字符串是否相等不相等返回 true。[ $a ! $b ] 返回 true。-z检测字符串长度是否为0为0返回 true。[ -z $a ] 返回 false。-n检测字符串长度是否为0不为0返回 true。[ -n $a ] 返回 true。str检测字符串是否为空不为空返回 true。[ $a ] 返回 true。
文件测试运算符重点
文件测试运算符用于检测 Unix/Linux 文件的各种属性。
操作符说明举例-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。
注意权限几个判断如果只有一个部分符合则认为是有权限的。