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()

查看 py :    python 文件名.py
 
shell脚本的规范:
定义脚本的执行环境 #!/usr/bin/bash

shell 中的管道运用
※解释:
通过组合命令来完成输出。管道符其实就是下一个命令对上一个命令的输出结果
 
重定向:
1、箭头的指向就是数据的流向。
 
※数字说明
1、标准输入(英文:stdin): 代码为0,使用<或<<。数据流从右向左。
2、标准正常输出(英文:stdout):代码为1,使用>或>>。数据流从左向右。
3、标准错误输出(英文:stderr):代码为2,使用2>或2>>。数据流从左向右

例子1:
[yanliao@localhost ~]$ echo haha > ./text.text
[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
[yanliao@localhost ~]$ echo 1234.5*10|bc|cut -d '2' -f1
1
 
删除命令 re
删除一个文件  rm 文件名
删除多个文件 rm 文件名  文件名
删除 目录 以及目录自己和目录下的文件夹  rm -r 目录名
删除空文件夹  rm -d 文件名
 
加减成除  expr 1 + 2
 
举例子 :算内存使用率
 
[root@localhost yanliao]# echo " 当前内存使用率:" `echo "scale=2;141*100/7966 "|bc `% "
当前内存使用率: 1.77%
 
数学运算:
 [root@localhost yanliao]# echo $((100+3))
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的位置上显示 
另外下面的输入 等于 上面的输入 即 不同写法 相同意思
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
 
数组
举例子:
echo "第一个元素为: ${my_array[0]}"
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

》定义关联数组
$ 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]}
输出:
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
检查n1是否与n2相等
[yanliao@localhost shell]$ test 1 -eq 1;echo $?
0
 
字符串比较运算
文件比较与运算
下面的图片内容 可以输出命令 man test 得到

检查文件是否存在目录  真为 0 ;假为 1

 

[yanliao@localhost ~]$ test -d /tep/abc ; echo $?

比较两个文件的新旧判断

$ 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 var in `sea 1 9`
三 赋值是一个字符串
 
for var in tony\'s is cool, 
do
echo "w:$var"
 
输出结果是:
 
w:tony's
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
输出结果是:倒计时: 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 "伯母好“
;;
 
举例子
 
case $1 in
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

shell 特殊变量
》shell 函数
语法一:
函数 () {
     代码块
     return N
     }
语法二:
function 函数名 {
     代码块
     return N
     }
举例子:]
#定义函数
fruit () {
    echo "apple eat...[ok]
person() {
    echo "tony...[fail]
 
}
#调用函数
fruit
person
 
posted @ 2022-07-01 14:38  30度以南  阅读(12)  评论(0)    收藏  举报