Shell脚本学习总结(一) 原

先看一个简单的shell程序

#!/bin/bash
#This is to show what a example looks like.
echo "Our first example"
echo #This inserts an empty line in output
echo "We are currently in the following directory:"
pwd
echo
echo "This directory contains the following files:"
ls
注释
#!/bin/bash   #!+shell的完全路径。作用:显示后续命令以哪种shell来执行这些命令。如不指定shell,则以当前shell作为执行的shell。
#This is to show what a example looks like.  作用:shell中以#开头,表示整个行就被注释。

Shell程序一般以.sh结尾

创建shell程序的步骤:
1、创建一个包含命令和控制结构的shell文件。
2、修改这个文件的权限使它可以执行。
chmod u+x
3、执行方式有三种
    方法1:./example01.sh
    方法2:使用绝对路径 
[root@izwz9eftauv7x69f5jvi96z shell-start]# /root/shell-start/example01.sh
    方法3:[root@izwz9eftauv7x69f5jvi96z shell-start]# bash example01.sh

Shell变量

变量是shell传递数据的一种方法。变量是用来代表每个值的符号名。

Shell变量分两类:临时变量+永久变量

临时变量:是shell程序内部定义的,其使用范围仅限于定义它的程序,对其它程序不可见

永久变量:是环境变量,其值不随shell脚本的执行结束而消失。

如:$PATH

[root@izwz9eftauv7x69f5jvi96z shell-start]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

#运行某个命令的时候,本地查找不到某个命令或文件,会到这个声明的目录中去查找

[root@izwz9eftauv7x69f5jvi96z shell-start]# which ll
alias ll='ls -l --color=auto'

         /usr/bin/ls
用户定义变量:由字母或下划线打头,由字母、数字或下划线序列组成,并且大小字母意义不同。变量名长度没有限制
例:1var是非法变量

使用变量值时,要在变量名前加上前缀”$”.

变量赋值:“=”两边没空格

[root@izwz9eftauv7x69f5jvi96z shell-start]# A=aaa

[root@izwz9eftauv7x69f5jvi96z shell-start]# A = aa

-bash: A: command not found
将一个命令的执行结果赋给变量
[root@izwz9eftauv7x69f5jvi96z shell-start]# A=`date`

[root@izwz9eftauv7x69f5jvi96z shell-start]# echo $A

Mon Jul 2 20:13:39 CST 2018

[root@izwz9eftauv7x69f5jvi96z shell-start]# B=$(ls -l)

[root@izwz9eftauv7x69f5jvi96z shell-start]# echo $B

total 4 -rw-r--r-x 1 root root 240 Jul 2 19:50 example01.sh

[root@izwz9eftauv7x69f5jvi96z shell-start]# A=$B

[root@izwz9eftauv7x69f5jvi96z shell-start]# echo $A

total 4 -rw-r--r-x 1 root root 240 Jul 2 19:50 example01.sh
可以利用变量和其它字符拼接成一个新的字符串
[root@izwz9eftauv7x69f5jvi96z shell-start]# MYDIR=/home/mk

[root@izwz9eftauv7x69f5jvi96z shell-start]# echo $MYDIR/zhangsan

/home/mk/zhangsan

[root@izwz9eftauv7x69f5jvi96z shell-start]# DAY=mon

[root@izwz9eftauv7x69f5jvi96z shell-start]# echo Today is $DAY day

Today is mon day

[root@izwz9eftauv7x69f5jvi96z shell-start]# echo Today is ${DAY}day

Today is Monday
set命令 #列出所有变量
[root@izwz9eftauv7x69f5jvi96z shell-start]# set | grep DAY

DAY=mon
给变量赋值多个单词
[root@izwz9eftauv7x69f5jvi96z shell-start]# NAME="mike Rom"

[root@izwz9eftauv7x69f5jvi96z shell-start]# echo $NAME

mike Rom

[root@izwz9eftauv7x69f5jvi96z shell-start]# NAME='SD'   #单引号之间的内容原封不动地指定给了变量

[root@izwz9eftauv7x69f5jvi96z shell-start]# echo $NAME

SD



[root@izwz9eftauv7x69f5jvi96z shell-start]# NAME="MIKE IS $NAME"  #双引号取消了空格的作用,特殊符号的含义保留

[root@izwz9eftauv7x69f5jvi96z shell-start]# echo $NAME

MIKE IS SD
unset命令    #删除变量

[root@izwz9eftauv7x69f5jvi96z shell-start]# echo $NAME

MIKE IS SD

[root@izwz9eftauv7x69f5jvi96z shell-start]# unset NAME

[root@izwz9eftauv7x69f5jvi96z shell-start]# echo $NAME

位置变量和特殊变量

位置变量:shell解释执行用户的命令时,将命令行的第一个字作为命令名,而其它字作为参数。由出现在命令行上的位置确定的参数称为位置参数。

位置变量:使用$N来表示

例:

[root@izwz9eftauv7x69f5jvi96z shell-start]# ./example01.sh  file1 file2 file3

$0这个程序的文件名example01.sh

$n这个程序的第n个参数值,n=1……N
特殊变量
有些变量是一开始执行Script脚本时就会设定,且不能被修改,但我们不叫它只读的系统变量,而叫它特殊变量。这些变量当一执行程序时就有了,以下是一些特殊变量:

$*  这个程序的所有参数

$#     这个程序的参数个数

$$     这个程序的PID

$!     执行上一个后台程序的PID

$?     执行上一个指令的返回值


小综合实例:

[root@izwz9eftauv7x69f5jvi96z shell-start]# vim example02.sh

#!/bin/bash

echo "$* 表示这个程序所有的参数"

echo "$# 表示这个程序的参数个数"


touch /tmp/a.txt

echo "$$ 表示程序的进程ID"


touch /tmp/b.txt &

echo "$! 执行上一个后台指令的PID"

echo "$$ 表示程序的进程ID"


测试:

[root@izwz9eftauv7x69f5jvi96z shell-start]# ./example02.sh aa bb cc dd

aa bb cc dd 表示这个程序所有的参数

4 表示这个程序的参数个数

6248 表示程序的进程ID

6250 执行上一个后台指令的PID

6248 表示程序的进程ID
例:变量在shell中的使用
[root@izwz9eftauv7x69f5jvi96z shell-start]# vim example03.sh

#!/bin/bash

var1="avav ddd"

echo $var1

var2=1234

echo "The value of $var2"

echo $HOME

echo $PATH

echo $PWD


[root@izwz9eftauv7x69f5jvi96z shell-start]# chmod +x example03.sh

[root@izwz9eftauv7x69f5jvi96z shell-start]# ./example03.sh

avav ddd

The value of 1234

/root

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

/root/shell-start
read命令

作用:从键盘读入数据,赋给变量


例1:

[root@izwz9eftauv7x69f5jvi96z shell-start]# read a b c

1 22 33333

[root@izwz9eftauv7x69f5jvi96z shell-start]# echo $a $b $c

1 22 33333

[root@izwz9eftauv7x69f5jvi96z shell-start]# echo $a

1


例2:在shell 中使用read命令

[root@izwz9eftauv7x69f5jvi96z shell-start]# vim read.sh

#!/bin/bash

echo "input 3 parameters"

read a b c

echo "the first parameter is $a"

echo "the second parameter is $b"

echo "the third parameter is $c"

测试:

[root@izwz9eftauv7x69f5jvi96z shell-start]# chmod +x read.sh

[root@izwz9eftauv7x69f5jvi96z shell-start]# ./read.sh

input 3 parameters

aa 122 333

the first parameter is aa

the second parameter is 122

the third parameter is 333

算术表达式

expr 命令

作用:对整数型变量进行算术运算

语法:expr 表达式  # 注意 运算符之间要有空格

如:

[root@izwz9eftauv7x69f5jvi96z shell-start]# expr 3+5

3+5

[root@izwz9eftauv7x69f5jvi96z shell-start]# expr 3 + 5

8


[root@izwz9eftauv7x69f5jvi96z shell-start]# var1=8

[root@izwz9eftauv7x69f5jvi96z shell-start]# var2=2

[root@izwz9eftauv7x69f5jvi96z shell-start]# expr $var1 - 8

0

[root@izwz9eftauv7x69f5jvi96z shell-start]# expr $var1 / $var2

4

[root@izwz9eftauv7x69f5jvi96z shell-start]# expr $var1 * $var2

expr: syntax error

[root@izwz9eftauv7x69f5jvi96z shell-start]# expr $var1 \* $var2

16



Expr例子2:

[root@izwz9eftauv7x69f5jvi96z shell-start]# vim expr.sh

#!/bin/sh

a=10

b=2

c=33

value1=`expr $a + $b + $c`

echo "The value of value1 is $value1"

value2=`expr $c \*  $b`

echo "The value of value2 is $value2"

value3=`expr $c /  $b`

echo "The value of value3 is $value3"




测试

[root@izwz9eftauv7x69f5jvi96z shell-start]# chmod +x expr.sh

[root@izwz9eftauv7x69f5jvi96z shell-start]# ./expr.sh

The value of value1 is 45

The value of value2 is 66

The value of value3 is 16


复杂的运算:

[root@izwz9eftauv7x69f5jvi96z shell-start]# var4=8

[root@izwz9eftauv7x69f5jvi96z shell-start]# expr `expr 5 + 11` / $var4

2


`` 反引号:把命令括号起来并执行

$(ls -l) :赋值

test测试语句

变量测试语句:

test命令

格式:

test 测试条件


测试范围:整数,字符串,文件


字符串和变量:

test str1==str2 是否相等

test str1!=str2 是否不相等

test str1 测试字符串是否不为空

test –n str1 测试字符串是否为空

test –z str1 测试字符串是否为空


测试整数:

test int1 –eq int2

test int1 –ge int2   >=

test int1 –gt int2   >

test int1 –le int2   <=

test int1 –lt int2   <

test int1 -ne int2  


说明:也可以省略test写成[ int1 –lt int2 ]


文件测试:

test –d file  #测试是否为目录

test –f file  #测试是否为文件

test –x file  #测试是否可执行

test –r file 

test –w file 



test –e file  #测试文件是否存在

test –s file  #测试是否为空文件

说明:

test –x file 简写成:[ -x file ]

if流程控制语句

If语句



语法:

if 条件

then

语句

fi


扩展:

;分号:表示两个命令写在一行,互不影响。

&&:相互影响。

[root@izwz9eftauv7x69f5jvi96z shell-start]# ll /opddd ;ll

ls: cannot access /opddd: No such file or directory

total 20

-rw-r--r-x 1 root root 240 Jul  2 19:50 example01.sh

-rwxr-xr-x 1 root root 250 Jul  2 20:50 example02.sh

-rwxr-xr-x 1 root root 107 Jul  2 20:55 example03.sh

-rwxr-xr-x 1 root root 212 Jul  2 21:31 expr.sh

-rwxr-xr-x 1 root root 151 Jul  2 21:09 read.sh

[root@izwz9eftauv7x69f5jvi96z shell-start]# ll && ll /opt/ssss

total 20

-rw-r--r-x 1 root root 240 Jul  2 19:50 example01.sh

-rwxr-xr-x 1 root root 250 Jul  2 20:50 example02.sh

-rwxr-xr-x 1 root root 107 Jul  2 20:55 example03.sh

-rwxr-xr-x 1 root root 212 Jul  2 21:31 expr.sh

-rwxr-xr-x 1 root root 151 Jul  2 21:09 read.sh

ls: cannot access /opt/ssss: No such file or directory



if例1:

[root@izwz9eftauv7x69f5jvi96z shell-start]# vim if.sh

#!/bin/bash

echo "if test"

if [ -x /bin/ls ] ; then

         /bin/ls

fi

echo "================================"

if [ -x /bin/ls ]

then

         /bin/ls

fi


测试:

[root@izwz9eftauv7x69f5jvi96z shell-start]# chmod +x if.sh

[root@izwz9eftauv7x69f5jvi96z shell-start]# ./if.sh

if test

example01.sh  example02.sh  example03.sh  expr.sh  if.sh  read.sh

================================

example01.sh  example02.sh  example03.sh  expr.sh  if.sh  read.sh
if/else语句



语法:

if 条件1 ; then

         命令1

else

         命令2:

fi


例:

[root@izwz9eftauv7x69f5jvi96z shell-start]# vim else.sh

#! /bin/bash


if [ -x /etc/passwd ] ; then

         /bin/ls

else

         pwd

fi


[root@izwz9eftauv7x69f5jvi96z shell-start]# chmod +x else.sh

[root@izwz9eftauv7x69f5jvi96z shell-start]# ./else.sh

/root/shell-start


多个条件的联合:

-a 或&& :逻辑与

-o 或|| :逻辑或


更复杂的if语句:

语法:

if 条件1 ; then

         命令1

elif 条件2 ;then

         命令2

elif 条件3 ;then

         命令3

else

         命令4

fi



综合实例:

[root@izwz9eftauv7x69f5jvi96z shell-start]# cat elif.sh

#!/bin/bash


echo "input a file name:"

read file_name


if [ -d $file_name ] ; then

         echo          " $file_name is a dir"

elif [ -f $file_name ] ; then

         echo          " $file_name is a file"

elif [ -c $file_name -o -b $file_name ] ; then

         echo          " $file_name is a device file"

else

         echo "$file_name is an unknow file "

fi


测试:

[root@izwz9eftauv7x69f5jvi96z shell-start]# ./elif.sh

input a file name:

/etc

 /etc is a dir

[root@izwz9eftauv7x69f5jvi96z shell-start]# ./elif.sh

input a file name:

/etc/passwd

 /etc/passwd is a file

[root@izwz9eftauv7x69f5jvi96z shell-start]# ./elif.sh

input a file name:

/dev/vda

 /dev/vda is a device file

[root@izwz9eftauv7x69f5jvi96z shell-start]# ./elif.sh

input a file name:

/edeasdfasd

/edeasdfasd is an unknow file


眼高手低  看会不代表能做出来

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java学习网

Java中application对象的19个常用方法

applicaton表示一个javax.servlet.ServletContext对象。他实现了用户间数据的共享,可存放全局变量。它开始于服务器的启动,直到服...

2425
来自专栏技术记录

Protobuf3语法详解

9555
来自专栏无题

堆外内存概要

DirectByteBuffer JDK中使用 DirectByteBuffer对象来表示堆外内存,每个 DirectByteBuffer对象在初始化时,都会创...

2424
来自专栏软件开发 -- 分享 互助 成长

谈谈 char *num="123";和char num[4]="123";的区别

最近写程序的时候发现这样一个问题 #include<iostream> #include <string.h> using namespace std; vo...

1958
来自专栏老马说编程

(87) 类加载机制 / 计算机程序的思维逻辑

上节,我们探讨了动态代理,在前几节中,我们多次提到了类加载器ClassLoader,本节就来详细讨论Java中的类加载机制与ClassLoader。 类加载...

1978
来自专栏york技术分享

awk 使用教程 - 通读篇(30分钟入门)

很多刚接触awk,sed等命令时,看到帮助文档一堆参数,一堆符号感觉有点慌,我刚开始学习时也出现过这样的问题,这篇文章从我们工作遇到的问题出发,由浅入深,重点在...

85117
来自专栏向治洪

android classloader双亲委托模式

概述 ClassLoader的双亲委托模式:classloader 按级别分为三个级别:最上级 : bootstrap classLoader(根类加载器) ;...

2488
来自专栏Java开发者杂谈

JDK1.7新特性(3):java语言动态性之脚本语言API

简要描述:其实在jdk1.6中就引入了支持脚本语言的API。这使得java能够很轻松的调用其他脚本语言。具体API的使用参考下面的代码: 1 package...

29710
来自专栏不止是前端

深入Node

36013
来自专栏惨绿少年

扩展正则表达式及应用

第1章 扩展正则表达式 1.1  + 前一个字符连续出现了1次或1次以上 egrep  "0+" oldboy.txt  1次或1次以上 >=1 egrep  ...

1980

扫码关注云+社区

领取腾讯云代金券