长沙网站开发制作,赣州新闻,苏州seo优化,成品网站5668入口的功能介绍Linux之Shell Shell概述Linux提供的Shell解析器bash和sh的关系Centos默认的解析器是bash Shell脚本入门脚本格式第一个脚本脚本常用的执行方式 变量系统预定义变量自定义变量特殊变量$n$#\$*、\$$? 运算符条件判断流程控制(▲)if判断case语句for循环while循环 read读取控制台输… Linux之Shell Shell概述Linux提供的Shell解析器bash和sh的关系Centos默认的解析器是bash Shell脚本入门脚本格式第一个脚本脚本常用的执行方式 变量系统预定义变量自定义变量特殊变量$n$#\$*、\$$? 运算符条件判断流程控制(▲)if判断case语句for循环while循环 read读取控制台输入 Shell概述 Shell是一个命令行解释器它接收应用程序/用户命令然后调用操作系统内核 Shell还是一个功能相当强大的编程语言易编写、易调试、灵活性强 Linux提供的Shell解析器 [guozihanhadoop100 ~]$ cat /etc/shells /bin/sh /bin/bash /usr/bin/sh /usr/bin/bash /bin/tcsh /bin/csh bash和sh的关系 -rwxr-xr-x. 1 root root 964536 11月 25 2021 bash lrwxrwxrwx. 1 root root 10 8月 25 20:20 bashbug - bashbug-64 -rwxr-xr-x. 1 root root 6964 11月 25 2021 bashbug-64 lrwxrwxrwx. 1 root root 4 8月 25 20:20 sh - bash Centos默认的解析器是bash [guozihanhadoop100 bin]$ echo $SHELL /bin/bash Shell脚本入门
脚本格式 脚本以#!/bin/bash 开头指定解析器 第一个脚本 需求创建一个 Shell 脚本输出 helloworld 实例实操 首先我们先创建文件夹program然后在文件夹里创建sh文件vim编辑 [guozihanhadoop100 桌面]$ mkdir program [guozihanhadoop100 桌面]$ cd program/ [guozihanhadoop100 program]$ touch helloword.sh [guozihanhadoop100 program]$ vim helloword.sh #!/bin/bash
echo helloworld脚本常用的执行方式 采用 bash 或 sh脚本的相对路径或绝对路径不用赋予脚本x 权限 sh脚本的相对路径 [guozihanhadoop100 program]$ sh ./helloworld.sh helloworld sh脚本的绝对路径 [guozihanhadoop100 program]$ sh /home/guozihan/桌面/program/helloworld.sh helloworld bash脚本的相对路径 [guozihanhadoop100 program]$ bash ./helloworld.sh helloworld bash脚本的相对路径 [guozihanhadoop100 program]$ bash /home/guozihan/桌面/program/helloworld.sh helloworld 采用输入脚本的绝对路径或相对路径执行脚本必须具有可执行权限x ①首先要赋予 helloworld.sh 脚本的x 权限 [guozihanhadoop100 program]$ chmod x helloworld.sh ②执行脚本 [guozihanhadoop100 program]$ ./helloworld.sh helloworld [guozihanhadoop100 program]$ /home/guozihan/桌面/program/helloworld.sh helloworld
注意第一种执行方法本质是 bash 解析器帮你执行脚本所以脚本本身不需要执行 权限。第二种执行方法本质是脚本需要自己
执行所以需要执行权限。 在脚本的路径前加上“.”或者 source ①现有文件test.sh,内容如下 #!/bin/bash A5 echo $A ②分别使用 shbash./ 和 . 的方式来执行结果如下 [guozihanhadoop100 program]$ bash test.sh 5 [guozihanhadoop100 program]$ sh test.sh 5 [guozihanhadoop100 program]$ chmod x test.sh [guozihanhadoop100 program]$ ./test.sh 5 [guozihanhadoop100 program]$ . test.sh 5
原因 前两种方式都是在当前 shell 中打开一个子 shell 来执行脚本内容当脚本内容结束则 子 shell 关闭回到父 shell 中。 第三种也就是使用在脚本路径前加“.”或者 source 的方式可以使脚本内容在当前 shell 里执行而无需打开子 shell这也是为什么我们每次要修改完/etc/profile 文件以后需要 source 一下的原因。 开子 shell 与不开子 shell 的区别就在于环境变量的继承关系如在子 shell 中设置的当前变量父 shell 是不可见 变量
系统预定义变量 常用系统变量 $HOME、$PWD、$SHELL、$USER 等 案例实操 查看系统变量的值 [guozihanhadoop100 ~]$ echo $HOME /home/guozihan 显示当前 Shell 中所有变量set [guozihanhadoop100 ~]$ set
自定义变量 基本语法 1定义变量变量名变量值注意号前后不能有空格 2撤销变量unset 变量名 3声明静态变量readonly 变量注意不能 unset 变量定义规则 1变量名称可以由字母、数字和下划线组成但是不能以数字开头环境变量名建议大写。 2等号两侧不能有空格 3在 bash 中变量默认类型都是字符串类型无法直接进行数值运算。 4变量的值如果有空格需要使用双引号或单引号括起来。 案例实操 定义变量 A [guozihanhadoop100 ~]$ A5 [guozihanhadoop100 ~]$ echo $A 5 给变量 A 重新赋值 [guozihanhadoop100 ~]$ A8 [guozihanhadoop100 ~]$ echo $A 8 撤销变量 A [guozihanhadoop100 ~]$ unset A [guozihanhadoop100 ~]$ echo $A 声明静态的变量 B2不能 unset [guozihanhadoop100 ~]$ readonly B2 [guozihanhadoop100 ~]$ echo $B 2 [guozihanhadoop100 ~]$ B9 -bash: B: 只读变量 在 bash 中变量默认类型都是字符串类型无法直接进行数值运算 [guozihanhadoop100 ~]$ C12 [guozihanhadoop100 ~]$ echo $C 12 变量的值如果有空格需要使用双引号或单引号括起来 [guozihanhadoop100 ~]$ DI love sunchen bash: love: 未找到命令… [guozihanhadoop100 ~]$ D“I love sunchen” [guozihanhadoop100 ~]$ echo $D I love sunchen 可把变量提升为全局环境变量可供其他 Shell 程序使用 export 变量 在 helloworld.sh 文件中增加 echo $B #!/bin/bash echo helloworld
echo $B[guozihanhadoop100 program]$ ./helloworld.sh helloworld [guozihanhadoop100 program]$ export B [guozihanhadoop100 program]$ ./helloworld.sh helloworld 2
特殊变量
$n 基本语法 $n 功能描述n 为数字$0 代表该脚本名称$1-$9 代表第一到第九个参数十以上的参数需要用大括号包含如${10} 案例实操 [guozihanhadoop100 program]$ touch parameter.sh [guozihanhadoop100 program]$ vim parameter.sh #!/bin/bash
echo $n
echo $0
echo $1
echo $[guozihanhadoop100 program]$ chmod 777 parameter.sh [guozihanhadoop100 program]$ ./parameter.sh cls xz $n ./parameter.sh cls xz
$# 基本语法 $# 功能描述获取所有输入参数个数常用于循环,判断参数的个数是否正确以及加强脚本的健壮性 实例实操 [guozihanhadoop100 program]$ vim parameter.sh #!/bin/bash
echo $n
echo $0
echo $1
echo $2
echo $#
echo $[guozihanhadoop100 program]$ chmod 777 parameter.sh [guozihanhadoop100 program]$ ./parameter.sh cls xz $n ./parameter.sh cls xz $n 2
$*、$ 基本语法 $* 功能描述这个变量代表命令行中所有的参数$*把所有的参数看成一个整体 $ 功能描述这个变量也代表命令行中所有的参数不过$把每个参数区分对待 案例实操 [guozihanhadoop100 program]$ vim parameter.sh #!/bin/bash
echo $n
echo $0
echo $1
echo $2
echo $#
echo $#
echo $*
echo $*
echo $
echo $[guozihanhadoop100 program]$ ./parameter.sh a b c d e f g $n ./parameter.sh a b $n 7 $n a b c d e f g $n a b c d e f g
$? 基本语法 $? 功能描述最后一次执行的命令的返回状态。如果这个变量的值为 0证明上一 个命令正确执行如果这个变量的值为非 0具体是哪个数由命令自己来决定则证明 上一个命令执行不正确了 案例实操 判断 helloworld.sh 脚本是否正确执行 [guozihanhadoop100 program]$ ./helloworld.sh helloworld [guozihanhadoop100 program]$ echo $? 0
运算符 基本语法 “$((运算式))” 或 “$[运算式]” 案例实操 计算23* 4 的值 [guozihanhadoop100 program]$ S$[(23)*4] [guozihanhadoop100 program]$ echo $S 20
条件判断 基本语法 1test condition 2[ condition ]注意 condition 前后要有空格 注意条件非空即为 true[ guozihan ]返回 true[ ] 返回 false。 常用判断条件 两个整数之间比较 -eq 等于equal -ne 不等于not equal -lt 小于less than -le 小于等于less equal -gt 大于greater than -ge 大于等于greater equal 注如果是字符串之间的比较 用等号“”判断相等用“!”判断不等。 按照文件权限进行判断 -r 有读的权限read -w 有写的权限write -x 有执行的权限execute 按照文件类型进行判断 -e 文件存在existence -f 文件存在并且是一个常规的文件file -d 文件存在并且是一个目录directory 案例实操 23 是否大于等于 22 [guozihanhadoop100 program]$ [ 23 -ge 22 ] [guozihanhadoop100 program]$ echo $? 0 helloworld.sh 是否具有写权限 [guozihanhadoop100 program]$ [ -w helloworld.sh ] [guozihanhadoop100 program]$ echo $? 0 /home/atguigu/cls.txt 目录中的文件是否存在 [guozihanhadoop100 program]$ [ -e /home/guozihan/cls.txt ] [guozihanhadoop100 program]$ echo $? 1 多条件判断 表示前一条命令执行成功时才执行后一条命令|| 表示上一 条命令执行失败后才执行下一条命令 [guozihanhadoop100 program]$ [ guozihan ] echo OK || echo notOK OK [guozihanhadoop100 program]$ [ ] echo OK || echo notOK notOK
流程控制(▲)
if判断 基本语法 单分支 if [ 条件判断式 ];then程序
fi或者 if [ 条件判断式 ]
then
程序
fi多分支 if [ 条件判断式 ]
then程序
elif [ 条件判断式 ]
then程序
else程序
fi注意事项 ①[ 条件判断式 ]中括号和条件判断式之间必须有空格 ②if 后要有空格 案例实操 输入一个数字如果是 1则输出 banzhang zhen shuai如果是 2则输出 cls zhen mei 如果是其它什么也不输出。 [guozihanhadoop100 program]$ touch if.sh
[guozihanhadoop100 program]$ vim if.sh#!/bin/bash
if [ $1 -eq 1 ]
then
echo banzhang zhen shuai
elif [ $1 -eq 2 ]
then
echo cls zhen mei
fi[guozihanhadoop100 program]$ chmod 777 if.sh
[guozihanhadoop100 program]$ ./if.sh 1
banzhang zhen shuai
[guozihanhadoop100 program]$ ./if.sh 2
cls zhen meicase语句 基本语法 case $变量名 in “值 1” 如果变量的值等于值 1则执行程序 1 ;; “值 2” 如果变量的值等于值 2则执行程序 2 ;; …省略其他分支… * 如果变量的值都不是以上的值则执行此程序 ;; esac 注意事项 1case 行尾必须为单词“in”每一个模式匹配必须以右括号“”结束。 2双分号“;;”表示命令序列结束相当于 java 中的 break。 3最后的“*”表示默认模式相当于 java 案例实操 输入一个数字如果是 1则输出 banzhang如果是 2则输出 cls如果是其它输出 renyao。 [guozihanhadoop100 program]$ touch case.sh
[guozihanhadoop100 program]$ vim case.sh#!/bin/bash
case $1 in
1)
echo banzhang
;;
2)
echo cls
;;
*)
echo renyao
;;
esac[guozihanhadoop100 program]$ chmod 777 case.sh
[guozihanhadoop100 program]$ ./case.sh
renyao
[guozihanhadoop100 program]$ ./case.sh 1
banzhang
for循环 基本语法1 for (( 初始值;循环控制条件;变量变化 ))
do程序
done案例实操1 从 1 加到 100 [guozihanhadoop100 program]$ touch for1.sh
[guozihanhadoop100 program]$ vim for1.sh #!/bin/bash
sum0
for((i0;i100;i))
do
sum$[$sum$i]
done
echo $sum[guozihanhadoop100 program]$ chmod 777 for1.sh
[guozihanhadoop100 program]$ ./for1.sh
5050基本语法2 for 变量 in 值 1 值 2 值 3…
do
程序
done案例实操2 打印所有输入参数 [guozihanhadoop100 program]$ touch for2.sh
[guozihanhadoop100 program]$ vim for2.sh #!/bin/bash
#打印数字
for i in cls mly wls
do
echo ban zhang love $i
done[guozihanhadoop100 program]$ chmod 777 for2.sh
[guozihanhadoop100 program]$ ./for2.sh
ban zhang love cls
ban zhang love mly
ban zhang love wls$*和$的区别 $*和$都表示传递给函数或脚本的所有参数不被双引号“”包含时都以$1 $2 …$n 的形式输出所有参数。 当它们被双引号“”包含时$*会将所有的参数作为一个整体以“$1 $2 …$n”的形式输 出所有参数$会将各个参数分开以“$1” “$2”…“$n”的形式输出所有参数。
while循环 基本语法 while [ 条件判断式 ]
do
程序
done案例实操 从 1 加到 100 [guozihanhadoop100 program]$ touch while.sh
[guozihanhadoop100 program]$ vim while.sh #!/bin/bash
sum0
i1
while [ $i -le 100 ]
do
sum$[$sum$i]
i$[$i1]
done
echo $sum[guozihanhadoop100 program]$ chmod 777 while.sh
[guozihanhadoop100 program]$ ./while.sh
5050read读取控制台输入 基本语法 read (选项) (参数) ①选项 -p指定读取值时的提示符 -t指定读取值时等待的时间秒如果-t 不加表示一直等待 ②参数 变量指定读取值的变量名 案例实操 提示 7 秒内读取控制台输入的名称 [guozihanhadoop100 program]$ touch read.sh
[guozihanhadoop100 program]$ vim read.sh #!/bin/bash
read -t 7 -p Enter your name in 7 seconds : NN
echo $NN[guozihanhadoop100 program]$ chmod 777 read.sh
[guozihanhadoop100 program]$ ./read.sh
Enter your name in 7 senconds:guozihan
guozihan