#!/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脚本的执行结束而消失。
如:$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 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 条件
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
眼高手低 看会不代表能做出来