shell / linux 脚本
shell 脚本的定义是将完成一个任务的所有的命令按照执行的先后顺序,自上而下写入到一个文本文件中 然后给予权限
nginx安装步骤 :
linux终端输入 ssh root@192.168.11.251 输入密码
1: 新建文件夹; 新建sh文件 ;在sh文件里输入:执行命令 (如图) 紫色的部分有误 应是 -- prefix=/usr/local/nginx
其中 -j 4 是指 4 个cpu

2: 按 esc ; 输入:wq 返回到 文件下
3: 在sh文件里输入:执行命令 (如图) 后开始安装![]()

4 查看有么有安装成功 新建窗口 输入命令 ssh root@192.168.11.251 输入 文件地址 在当前文件下 输入 cat nginx_install.sh 也可以输入 ls 查看当前列表
5 检查安装成功后 打开 . / sbin /nginx
6 再输入 执行命令 (如图) 后可在浏览器地址中输入192.168.11.251 打开页面![]()


创建文件夹:mkdir 文件名
删除文件夹:rm -r 文件名
创建/编辑: shell文件:vim 文件名.sh
执行sh文件:./ 文件名.sh 或者 bash 文件名.sh
打开权限: chmod 777 文件名.sh
出现bug: vim:未找到命令 输入 yum -y install vim
打开文件 cat 文件名 ; cat -n 文件名 指输出行号+内容
在Linux 创建 py文件
[yanliao@localhost shell]$ python
Python 2.7.5 (default, Oct 14 2020, 14:45:30)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-44)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> exit()
Python 2.7.5 (default, Oct 14 2020, 14:45:30)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-44)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> exit()
查看 py : python 文件名.py
shell脚本的规范:
定义脚本的执行环境 #!/usr/bin/bash
shell 中的管道运用
※解释:
通过组合命令来完成输出。管道符其实就是下一个命令对上一个命令的输出结果
重定向:
1、箭头的指向就是数据的流向。
※数字说明
1、标准输入(英文:stdin): 代码为0,使用<或<<。数据流从右向左。
2、标准正常输出(英文:stdout):代码为1,使用>或>>。数据流从左向右。
3、标准错误输出(英文:stderr):代码为2,使用2>或2>>。数据流从左向右
1、标准输入(英文:stdin): 代码为0,使用<或<<。数据流从右向左。
2、标准正常输出(英文:stdout):代码为1,使用>或>>。数据流从左向右。
3、标准错误输出(英文:stderr):代码为2,使用2>或2>>。数据流从左向右
例子1:
[yanliao@localhost ~]$ echo haha > ./text.text
[yanliao@localhost ~]$ cat text.text
haha
[yanliao@localhost ~]$ cat text.text
haha
例子2: wc 是统计的意思
[yanliao@localhost ~]$ wc < text.text
1 1 5
例子3: 使用xarge命令 把文本内容拆成多行
xarge -n 4 < shuzi.txt
移动命令
1 从一个文件夹aa.sh 移动到另一个文件夹bb:
mv ./aa.sh ./bb/
2 多个文件夹aa.sh ab.sh ac.sh 移动到另一个文件夹bb
mv a* ./bb/
3: -f 强制性覆盖
touch 文件名
cut命令:计算结果为 12345 ;根据 cut -d 数字 来 区前面的数字
[yanliao@localhost ~]$ echo 1234.5*10|bc|cut -d '3' -f1
12
12
[yanliao@localhost ~]$ echo 1234.5*10|bc|cut -d '2' -f1
1
1
删除命令 re
删除一个文件 rm 文件名
删除多个文件 rm 文件名 文件名
删除 目录 以及目录自己和目录下的文件夹 rm -r 目录名
删除空文件夹 rm -d 文件名
加减成除 expr 1 + 2
举例子 :算内存使用率
[root@localhost yanliao]# echo " 当前内存使用率:" `echo "scale=2;141*100/7966 "|bc `% "
当前内存使用率: 1.77%
当前内存使用率: 1.77%
数学运算:
[root@localhost yanliao]# echo $((100+3))
103
103
退出脚本 为 exit num 其中num代表一个整数
管道的作用 将前面一个结果 传到后一个命令
bc 是Linux下的计算器
echo "2^8" |bc
256
格式化输出
》echo命令
$( )中放的是命令,相当于` ` 意思是执行命令 举例子:echo `ls`
` ` 其本身就对\进行了转义,保留了其本身意思
-n : 不换行
例子 echo -n "date: ";date +%F
输出结果 date: 2019-12-15
例子:ench -
-e : 出现特殊字符 特别处理 不会当作文字输出
-b : 删除前一个字符
》转义字符
》颜色输出
shell 输入
》read命令:默认接受键盘的输入,回车符代表输入结束
举例子:
#! /usr/bin/bash
clear
echo -ne "login: "
read acc
echo "account: $acc" #表示用户输入的内容将在acc的位置上显示
clear
echo -ne "login: "
read acc
echo "account: $acc" #表示用户输入的内容将在acc的位置上显示
另外下面的输入 等于 上面的输入 即 不同写法 相同意思
read -p -e " login : " acc
》变量
变量概念:变量是编程中最常见的一种临时在内存中存取数据的一种方式
变量分类: 1 本地变量:用户私有变量 只有本用户可以使用,保存在家目录下的 .bash_profile 、 bashrc文件中
2全局变量:所有用户都可以使用,保存在/etc/profile、/etc/bashrc 文件中
3用户自定义变量 :用户自定义,比如脚本中的变量
定义变量:变量名=值
重要环境变量详解:可执行程序的搜索目录,可执行程序包括Linux系统命令和用户的应用程序,如果可以执行程序的目录不在path指定的目录中,执行时需要指定目录
path环境变量存放的是目录列表,目录之间用冒号分割,最后的原点表示当前目录
export PATH=目录1:目录2:目录3.......目录n
举例子:查看当前目录:
[yanliao@localhost ~]$ env|grep PATH
PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/home/yanliao/.local/bin:/home/yanliao/bin
WINDOWPATH=1:1
PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/home/yanliao/.local/bin:/home/yanliao/bin
WINDOWPATH=1:1
数组
举例子:
echo "第一个元素为: ${my_array[0]}"
echo "第二个元素为: ${my_array[1]}"
echo "第三个元素为: ${my_array[2]}"
echo "第四个元素为: ${my_array[3]}"
echo "输出数组的长度: ${my_array[@]}"
echo "计算数组的长度:${#my_array[@]}"
echo "第二个元素为: ${my_array[1]}"
echo "第三个元素为: ${my_array[2]}"
echo "第四个元素为: ${my_array[3]}"
echo "输出数组的长度: ${my_array[@]}"
echo "计算数组的长度:${#my_array[@]}"
输出结果:
[yanliao@localhost shell]$ bash demo.sh
第一个元素为: A
第二个元素为: B
第三个元素为: C
第四个元素为: D
输出数组的长度: A B C D
计算数组的长度:4
第一个元素为: A
第二个元素为: B
第三个元素为: C
第四个元素为: D
输出数组的长度: A B C D
计算数组的长度:4
》定义关联数组
$ declare -A name_array1
$ declare -A name_array2
>>关联数组赋值:
>一次赋一个值:
name_array1[index1]=pear
name_array1[index2]=apple
举例子:
name_array1[fruit]='tony'
>一次赋多个值
name_array2=([index1]=tom [index2]=jack [index3]=apple)
举例子
declare -A name_array2
name_array2=([name]='tony' [age]=18)
echo ${name_array2[name]}
echo ${name_array2[age]}
name_array2=([name]='tony' [age]=18)
echo ${name_array2[name]}
echo ${name_array2[age]}
输出:
tony
tony
age
>>查看数组
echo ${
name_array1[index1]}
》 if判断语句
〉数学比较运算
-eq 等于 -gt 大于 -lt 小于 -ge 大于或等于 -le 小于或等于 -ne 不等于
检验举例子 真为 0 ;假为 1
检查n1是否不等于n2
[yanliao@localhost shell]$ test 1 -ne 1;echo $?
1
1
检查n1是否与n2相等
[yanliao@localhost shell]$ test 1 -eq 1;echo $?
0
0
〉字符串比较运算
文件比较与运算
下面的图片内容 可以输出命令 man test 得到

检查文件是否存在目录 真为 0 ;假为 1
[yanliao@localhost ~]$ test -d /tep/abc ; echo $?
1
比较两个文件的新旧判断
$ test float.sh -nt /tmp/basim ; echo $?
1
-ef 是代表拥有共同的节点
-x 代表检查文件是否存在可行 有时候在root 的权限下 有时 不可读 在用户下的权限下 有时 可读
echo -n 不换行输出
例子:
$echo -n "123" $echo "456"
最终输出 :
123456
而不是:
123
456
2、echo -e 处理特殊字符
若字符串中出现以下字符,则特别加以处理,而不会将它当成一般文字输出:
\a 发出警告声;
\b 删除前一个字符;
\c 最后不加上换行符号;
\f 换行但光标仍旧停留在原来的位置;
\n 换行且光标移至行首;
\r 光标移至行首,但不换行;
\t 插入tab;
\v 与\f相同;
\\ 插入\字符;
\nnn 插入nnn(八进制)所代表的ASCII字符;
例子: $echo -e "a\bdddd"
最终输出:
dddd
chmod命令:
修改文件或目录的权限
+ 、-、= 变更权限
chmod o+x 文件目录名 给其他组的用户增加执行的权限
chmod o+w 文件目录名 给其他组的用户增加写的权限 chmod a-x 文件目录名 给所有人去掉可执行文件的权限
》字符串比较运算
== 等于 (一个等号是代表赋值运算 P)
!= 不等于
-n 检查字符串的长度是否大于0
-z 检查字符串的长度是否为0
》逻辑运算
&& 与 ;
|| 或 ;
! 非 :
》赋值运算
= 举例子 a=10 name='baism'
》if 语法
第一种
if [ condition ]
then
commands
fi
第二种语法
if [ condition ]
then
commands1
else
commands2
fi
第三种语法
if [ $1 -gt $2 ]
then
echo "$1>$2"
elif [ $1 -eq $2 ]
then
echo "$1=$2"
else
echo "$1<$2"
fi
》高级表达式
可以使用(( ))进行算法
if (( 100%3+1>1 ))
then
echo "yes"
else
echo "no"
fi
》for 条件循环语句 明确知道循环次数 不知道什么结束循环 用while
seq 1 9
输出是 数字1 到9
一 for直接赋值
for shuzi in 1 2 3 4
for shuzi in 1 2 3 4
二 使用命令来赋值
for var in `sea 1 9`
三 赋值是一个字符串
for var in tony\'s is cool,
do
echo "w:$var"
do
echo "w:$var"
输出结果是:
w:tony's
w:is
w:cool,
四 使用算法来赋值
w:is
w:cool,
四 使用算法来赋值
for (( i=1;i<10;i++;n=10;n>0;n- ))
do
echo $i\$n
done
\t命令
是水平制表(制表符) ,就是键盘上的tab键的功能,代码案例分析:
echo -e "a\tb" #输出的就是a b,a与b中间的空位就是水平制表(制表符)。 |
在linux下想从键盘输入制表符,需要同时按下Ctrl+v+tab 即可(或者用命令/t参数代替tab键的功能)。
\b代表字与字中间那个看不见的东西 两边只要没有数字、字母、汉字、下划线,如
here is a word
那么,这句中有好几个\b, 每个单词的前后都有一个\b.
》循环控制语句
>> sleep N 脚本执行到该步休眠 N 秒
echo -n "倒计时:"
for i in `seq 9 -1 1`
do
echo -n -e "\b$i"
sleep 1
done
echo
for i in `seq 9 -1 1`
do
echo -n -e "\b$i"
sleep 1
done
echo
输出结果是:倒计时: 9
结果是动态 从9 自动跳到1
》break
》continue
for i in seq 1 5
do
echo $i
if [ $i -eq 3 ]
then
break
fi
done
输出结果是 1245
for中嵌套if
举例子
for (( ;; )
do
read -p 'char:' ch
if [ $ch= ''q'']
then
break
else
echo "你输入的字符是:$ch"
fi
done
》while 循环
while [条件为真]
do
代码
done
举例子:
read -p 'login:' account
while [ $account != 'root']
do
read -p 'login:' account
done

嵌套 if for while
循环控制 sleep break continue
举例子:
i=1
while [ $i -lt 10 ]
do
echo $i
i=$(i+1)
done
封住代码写法 a2() { 代码 }
99乘法表举例子:
n=1
while [ $n -lt 10 ];do
for [m=1;m<=10;m++];do
echo -n -e ''$n*$m=$(n*m)\t"
done
echo
n=$((n+1))
done
》until 循环
语法:
until [ conditon ] 条件为假做循环
do
代码
done
举例子:-gt 大于
num=2
nutil [ $num -gt 4 ]
do
echo $num
num=$(num+1)
done
》case多条件语句 根据不同条件执行不同的代码块
语法:
case 变量值 in
条件1 )
执行代码块1
;; #代表结束
条件2 )
执行代码块1
;;
.....
#代表退出
举例子:
read -p 'num:' n
case $n in
1)
echo "haha"
;;
*)
echo ''hehe"
;;
esac
输出结果是:
num:1
haha
num:2
hehe
case $1 in
zmn)
echo "伯母好“
;;
举例子
zmn|ZMN)
echo "薄"
;;
*)#任意情况
echo "yiyi"
;;
esac
输出结果是: 要自己打出情况
[yanliao@localhost case_shell.sh]$ sh case_shell.sh zmn
薄
[yanliao@localhost case_shell.sh]$ sh case_shell.sh 1 #任意情况下的任意输入
yiyi
薄
[yanliao@localhost case_shell.sh]$ sh case_shell.sh 1 #任意情况下的任意输入
yiyi
shell 特殊变量![]()



》shell 函数
语法一:
函数 () {
代码块
return N
}
语法二:
function 函数名 {
代码块
return N
}
举例子:]
#定义函数
fruit () {
echo "apple eat...[ok]
}
person() {
echo "tony...[fail]
}
#调用函数
fruit
person

浙公网安备 33010602011771号