shell脚本(.bash/.sh)
- 用cat /etc/shells可以显示系统安装的Shell.
- shell是一个可以一次性执行的可执行文件,即*.sh //相当于*.bat
- 脚本格式
1)shell脚本必须为Unix文本文件
2)shell脚本的第一句必须指定解释的shell或者空行
• 通常固定格式为:#!/bin/sh
• #号及其后面跟随的同一行的所有内容都被忽略
3)shell脚本必须有可执行权限
4)$,*,\’,\是脚本保留字符,要使用需用右斜杠
5)#语句 //#号就是注释的意思 - 变量类型
1)系统变量
2)环境变量
3)自定义变量
eg:
myfile="123" #给myfile变量赋值
echo ${myfile} #输出myfile的值
变量特点:
1)所有变量不用定义可以直接使用
2)所有变量值都是字符类型
- 注意’字符串’和 “字符串” 意义不同
echo ‘字符串’ #’'里的字符串按原样输出
echo “字符串” #""里的字符串若是变量即输出值,无则原样输出 - 自定义变量
var=12
echo ${var:-13} #-表示空值置换
#输出:12
#相当于:var==NULL ? 13 : var
#如果var的值为空,则输出13其中var的值没变,否则为var的值
========其它表达式的含义======
echo ${var:=value} //空值置换,若为空则给var赋值并输出
echo ${var:?} //空值出错,若为空显示系统提示的错误信息
echo ${var:?"err"} //若为空,则显示自定义的提示的错误信息
echo ${var:+value} //有值置换,若有值则输出置换后的值
- 环境变量
//shell 环境变量是所有shell 程序都会接收的参数。
1)PATH 命令搜索路径,以冒号为分隔符.注意与DOS下不同的是,当前目录不在系统路径里
2)HOME 用户home目录的路径名,是cd命令的默认参数
3)IFS 定义SHELL使用的分隔符 ,指命令行参数分隔符IFS=$’ \t\n’
4)LOGNAME 用户登录名
5)SHELL SHELL的路径名
6)TERM 终端类型 LD_LIBRARY_PATH 寻找库的路径,以冒号分隔
用法:(直接在终端下操作)
export LOGNAME //自定义一个环境变量
echo LOGNAME //输出当前的用户登录名
输出:root //当前用户是是哪个用户就输出哪个用户名
其它用法:
1)export PATH=/home/atao:$PATH //将目录添加到了环境变量路径中
2)unset 变量名 //取消该定义的变量
【补充】
1)export //表示设置指定的环境变量
2)unset //用于取消环境变量和自定义的变量
8. 常用系统变量
$n $1表示第一个参数 $2表示第二个参数 ...
$# 显示命令行参数的个数
$0 显示当前程序的名称
$? 前一个命令或函数的返回值
$* 以"参数1 参数2 ..."形式保存所有参数
$@ 以"参数1" "参数2" ... 形式保存所有参数
$$ 本程序的(进程ID号)PID
$! 上一个命令的PID
用法:echo "$$"
- 表达式的运算达
格式:$((表达式))
eg: echo $((1 + 3)) #输出:4
*其中两种不同的将字符串当成数学表达式的关键字//let和expr
1)let num=1+3
echo $num #输出:4
2)num=`expr 1 + 3`
echo $num #输出:4
#注意:`这个字符是Esc键下的那个字符,不是单引号.
- $(())支持多进制的表示
八进制$((08))
十六进制$((0x16)) - $((进制数#数字))任意进制的表示
echo $((2#1101010)) #2进制表示
echo $((8#377)) #8进制表示
echo $((16#D8)) #16进制表示
echo $((12#10)) #12进制表示
echo $((36#ZZYY)) #36进制表示
=条件判断=
- 文件比较运算符
-e filename //如果 filename存在,则为真
-d filename //如果 filename为目录,则为真
-f filename //如果 filename为常规文件,则为真
-L filename //如果 filename为符号链接,则为真
-r filename //如果 filename可读,则为真
-w filename //如果 filename可写,则为真
-x filename //如果 filename可执行,则为真
filename1 -nt filename2 //如果 filename1比 filename2新,则为真
filename1 -ot filename2 //如果 filename1比 filename2旧,则为真
- 字符串比较运算符
-z string //如果 string长度为零,则为真
-n string //如果 string长度非零,则为真
string1 = string2 //如果 string1与 string2相同,则为真
string1 != string2 //如果 string1与 string2不同,则为真
- 算术比较运算符
num1 -eq num2 //等于 [ 3 -eq $mynum ]
num1 -ne num2 //不等于 [ 3 -ne $mynum ]
num1 -lt num2 //小于 [ 3 -lt $mynum ]
num1 -le num2 //小于或等于 [ 3 -le $mynum ]
num1 -gt num2 //大于 [ 3 -gt $mynum ]
num1 -ge num2 //大于或等于 [ 3 -ge $mynum ]
=判断表达式是否为真的两种表示方法=
- test和[] //返回0成功,返回1失败
方法一:test 表达式
eg:test 1 -eq 0 #表达式为假
方法二:[ 表达式 ]
eg: [ 1 -eq 0 ] #表达式为假
=二种分支语句=
- if和case
- if/then/else/fi或者if/then/elif/fi
用法:
- if/then/else/fi或者if/then/elif/fi
if [ -d /home/atao/demo1 ]
then
echo true
else
echo false
fi
#如果demo1目录存在就执行then后面的语句,否则执行else后的语句
等同于
1) [ -d /home/atao/demo1 ] && echo true || echo false
2) test -d /home/atao/demo1 && echo true || echo false
- case 字符串 in; 模式1) 语句;;模式2) 语句;;esac
其中:模式可以有多个值,用|分开 如1|2|3|4|5)
用法:
echo -n "please input option:" #提示输入信息
read input_s #从键盘输入
case "$input_s" in #判断入口
1)echo "Linux";;
2)echo "Windows";;
3)echo "Ubuntu";;
*)echo "input_s $input_s choice err" #*)相当于default
exit 1 #错误则返回1
esac
=三种循环语句=
- for 判断表达式 ;do 语句;done
#!/bin/sh
1)for((x=1; x<5; x++))
do
echo "num $x=$x"
done
2)for x in 123 "abc" "666"
do
echo ${x}
done
- while 判断表达式; do 语句;done
#!/bin/sh
x=1
while((x<=10))
do
echo "Hello x is $x"
let x=x+1 #相当于x++
done
- until 判断表达式;do 语句;done
翻译:until=直到…为止
功能描述:重复循环直到条件为真为止
i=0
until [ $i -ge 20] #当i>=20的时候循环
do
i=$(($i+1))
echo $i
done
- shift命令
功能描述:循环从命令行参数位置变量值取一个值出来,并且把总数减一
• shift后可加整数进行一次多个移位
eg:shift 3
• 用法:
until [ $# -eq 0 ] #从终端获取参数,当参数总数等于0终止循环
do
echo "value=$1 count=$#"
shift 3 #每次向后移动3个位置
done
#注意命令行参数总数,$#每shift一次,值减3
=三种跳出机制=
- break
break [n]
//中止循环过程的执行,并跳到下一个命令。N表示跳出嵌套的层数 - continue
continue [n]
//停止循环过程的当前一个反复并且跳到循环中的下一个反复过程的开始部分,n表示忽略的层数 - exit
exit [n]
//停止shell程序的执行,并且将返回值设置为n。
=shell函数=
- 不能单独写在一个脚本里,至少有一个调用语句
- 实例
#!/bin/sh
show()
{
echo "output show $*" #输出参数表
}
echo "Hello kitty"
#调用show()函数,记住在定义函数的脚本里,至少要调用一次
show 123 "abc" "666"
echo "============"
echo $*
echo $1
=交互式脚本(输入输出)=
- echo 输出语句
- read 变量名
常用参数:read -p “提示信息” //每次输入时read提示
用法 :
#!/bin/sh
read -p "Please input var = " var
echo "var = ${var}"
- 从管道里读取
#!/bin/sh
#read读取一个变量
ls | while read file #默认在本目录循环读取文件
do
ls $file #显示读取到的文件
done
#!/bin/sh
#read可一次性读取多个变量
#默认在本目录中分别读取文件名和文件对应的id号
ls -i | while read file id
do
#file存的是文件名,id存的是文件对应的节点号
echo "File is $file ID is $id"
done
- select 表达式是bash的扩展应用,用户可以从一组不同的值中进行选择
翻译:select 选择
语法结构:
#!/bin/sh
select var in "Linux" "Windows" "Ubuntu"
do
break
done
echo "You have selected $var"
输出:
1) Linux
2) Windows
3) Ubuntu
#? 1
You have selected Linux
=脚本调试=
//直接在终端下输入命令
- sh -x 命令
•功能描述:执行该脚本并显示所有变量的值。- sh -x name.sh #sh表示运行
- bash -x name.sh #与上述功能一样,表示运行
- sh -n 命令
•功能描述:不执行,只执行语法检查
sh -n name.sh #运行后不报错表示没错误 - trap 命令
• 功能描述:令用于捕获指定的信号并执行预定义的命令。
• 用法
trap ‘command’ signal
//其中signal是要捕获的信号,command是捕获到指定的信号之后,所要执行的命令。可以用kill–l命令看到系统中全部可用的信号名,捕获信号后所执行的命令可以是任何一条或多条合法的shell语句,也可以是一个函数名。
• Shell伪信号
1)EXIT 从一个函数中退出或整个脚本执行完毕
2)ERR 当一条命令返回非零状态时(代表命令执行不成功)
3)DEBUG 脚本中每一条命令执行之前
• (DEBUG)对相关变量的全程跟踪
trap 'echo “before execute line:$LINENO, a=$a,b=$b,c=$c”' DEBUG
• (EXIT)判断脚本的执行状态以及出错原因
trap 'command' EXIT 或 trap 'command' 0
• (ERR)追踪执行不成功的命令或函数,并输出相关的调试信息
trap 'ERRTRAP $LINENO' ERR
=系统的几个脚本=
- init脚本的存储目录
• /etc/rc ,/etc/rc.d/init.d 或者 /etc/init.d 目录下
2./sbin/service 用于控制各种服务的启动和停止
用法:
>: /sbin/service smb restart #重启smb服务器