先看一个简单的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 眼高手低 看会不代表能做出来