Shell编程
shell是C语言写的程序 通过shell可以访问系统内核
shell既是命令语言, 又是程序设计语言
shell编程一般是指编写shell script脚本编程
shell编程只需要 文本编辑器和脚本解释器
bash是大多数linux默认的shell ( /etc/shells )
基本格式
hello.sh 扩展名不影响脚本执行 见名知意 如果用php编写脚本 就用.java
#!/bin/bash echo "Hello World !"
- 编写脚本文件( 第一行 加 #! + 使用的解释器)
- 给脚本文件添加权限 chmod 777 hello.sh
- u user g group o other a all
- chomd u+x hello.sh 本用户添加执行权限
- chmod g+w hello.sh 同组用户添加写权限
- chmod o+r hello.sh 其他用户添加读权限
- chmod a-x hello.sh 所有用户去除执行权限
- 执行脚本文件
- ./hello.sh
- sh hello.sh 使用sh解释器
- /bin/bash /root/hello.sh 作为解释器参数运行,直接运行解释器
shell变量
首字母必须为字母, 不能使用空格 标点符号 bash关键字, 可以使用下划线
变量名和等号之间不能有空格
- my_name=“hrh” 定义一个变量
- echo $my_name 使用一个变量
- echo ${my_name} 使用一个变量(加括号 便于识别变量边界)
- readonly my_name 定义为只读变量
- unset my_name 删除变量
局部变量 局部变量在脚本或命令中定义,仅在当前 shell 实例中有效 其他 shell 启动的程序不能访问局部变量
环境变量 所有的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行(set 命令查看当前环境 变量)
shell 变量 由 shell 程序设置的特殊变量(既有局部变量,又有环境变量) 这些变量保证了 shell 的正常运行
shell参数传递
$# 传递到脚本的参数个数
$* 以一个单字符串显示所有向脚本传递的参数。
$$ 脚本运行的当前进程 ID 号
$! 后台运行的最后一个进程的 ID 号
@ 与 @ 与 @与*相同,但是使用时加引号,并在引号中返回每个参数。
$? 显示最后命令的退出状态。0 表示没有错误,其他任何值表明有错误。#!/bin/bash echo "参数个数 + $#" echo "文件名 + $0" echo "第二个参数 + $2" echo "所有参数* + $*" echo "进程号 + $$" echo "进程号 + $!" echo "所有参数@ + $@"
$* 和 $@ 都表示传递给脚本的参数列表
$* $@ 没有区别
“ ∗ " " *" " ∗""@” 加引号时, *返回"1 2 3 4" @返回"1" “2” “3” “4”
shell运算符
原生bash不支持数学运算(a=1+1 不支持 会认为是字符串)
- val=`expr 1 + 1` 反引号包裹 expr是表达式计算工具 1 + 1 表达式和运算符之间必须有空格
- val=$((1+1))
- val=$[1+1]
算术运算符
a=10 b=20 val=`expr $a + $b` echo "a + b : $val" val=`expr $a - $b` echo "a - b : $val" val=`expr $a \* $b` echo "a * b : $val" val=`expr $b / $a` echo "b / a : $val" val=`expr $b % $a` echo "b % a : $val" if [ $a == $b ] then echo "a 等于 b" fi if [ $a != $b ] then echo "a 不等于 b" fi
关系运算符
关系运算符只支持数字,不支持字符串,除非字符串的值是数字。 EQ 就是 EQUAL等于 NQ 就是 NOT EQUAL不等于 GT 就是 GREATER THAN大于 LT 就是 LESS THAN小于 GE 就是 GREATER THAN OR EQUAL 大于等于 LE 就是 LESS THAN OR EQUAL 小于等 #!/bin/bash a=10 b=20 if [ $a -eq $b ] then echo "$a -eq $b : a 等于 b" else echo "$a -eq $b: a 不等于 b" fi if [ $a -ne $b ] then echo "$a -ne $b: a 不等于 b" else echo "$a -ne $b : a 等于 b" fi if [ $a -gt $b ] then echo "$a -gt $b: a 大于 b" else echo "$a -gt $b: a 不大于 b" fi if [ $a -lt $b ] then echo "$a -lt $b: a 小于 b" else echo "$a -lt $b: a 不小于 b" fi if [ $a -ge $b ] then echo "$a -ge $b: a 大于或等于 b" else echo "$a -ge $b: a 小于 b" fi if [ $a -le $b ] then echo "$a -le $b: a 小于或等于 b" else echo "$a -le $b: a 大于 b" fi
布尔运算符
#!/bin/bash a=10 b=20 if [ $a != $b ] then echo "$a != $b : a 不等于 b" else echo "$a != $b: a 等于 b" fi if [ $a -lt 100 -a $b -gt 15 ] then echo "$a 小于 100 且 $b 大于 15 : 返回 true" else echo "$a 小于 100 且 $b 大于 15 : 返回 false" fi if [ $a -lt 100 -o $b -gt 100 ] then echo "$a 小于 100 或 $b 大于 100 : 返回 true" else echo "$a 小于 100 或 $b 大于 100 : 返回 false" fi if [ $a -lt 5 -o $b -gt 100 ] then echo "$a 小于 5 或 $b 大于 100 : 返回 true" else echo "$a 小于 5 或 $b 大于 100 : 返回 false" fi
逻辑运算符
#!/bin/bash a=10 b=20 if [[ $a -lt 100 && $b -gt 100 ]] then echo "返回 true" else echo "返回 false" fi if [[ $a -lt 100 || $b -gt 100 ]] then echo "返回 true" else echo "返回 false" fi
字符串运算符
#!/bin/bash a="abc" b="efg" if [ $a = $b ] then echo "$a = $b : a 等于 b" else echo "$a = $b: a 不等于 b" fi if [ $a != $b ] then echo "$a != $b : a 不等于 b" else echo "$a != $b: a 等于 b" fi if [ -z $a ] then echo "-z $a : 字符串长度为 0" else echo "-z $a : 字符串长度不为 0" fi if [ -n $a ] then echo "-n $a : 字符串长度不为 0" else echo "-n $a : 字符串长度为 0" fi if [ $a ] then echo "$a : 字符串不为空" else echo "$a : 字符串为空" fi
文件测试运算符
文件测试运算符用于检测 Unix 文件的各种属性。#!/bin/bash file="/var/test.sh" if [ -r $file ] then echo "文件可读" else echo "文件不可读" fi if [ -w $file ] then echo "文件可写" else echo "文件不可写" fi if [ -x $file ] then echo "文件可执行" else echo "文件不可执行" fi if [ -f $file ] then echo "文件为普通文件" else echo "文件为特殊文件" fi if [ -d $file ] then echo "文件是个目录" else echo "文件不是个目录" fi if [ -s $file ] then echo "文件不为空" else echo "文件为空" fi if [ -e $file ] then echo "文件存在" else echo "文件不存在" fi
流程控制
if else
if 条件 then (if成立执行的代码..) elif 条件 then (elseif成立执行的代码..) else (if和elseif都不成立时执行的代码..) fi # 空格... if [ $a == $b ] then echo "true" fi if [ $a != $b ] then echo "true" else echo "false" fi
for
# 1 for N in 1 2 3 do (循环代码...) echo $N done for N in 1 2 3; do echo $N; done # 2 for ((i = 0; i <= 5; i++)) do (循环代码...) echo "welcome $i times" done
while
while 条件 do (指定代码...) done i=1 while ((i<=3)) do echo $i let i++ #let 可以使变量++ 或 -- done
case
read i case $i in 1) echo $i ;; 2) echo $i ;; *) echo "boon!" ;; esac
函数使用
脚本文件 执行顺序时从上往下 ,从左至右 没有编译器编译
所以使用自定义函数时, 要先定义,再使用
参数返回,可以显示加 return ,如果不加,将以最后一条命令运行结果,作为返回值。 return 后跟数值 n(0-255)
# 定义 funWithParam(){ echo "第一个参数为 $1 !" echo "第二个参数为 $2 !" echo "第十个参数为 $10 !" echo "第十个参数为 ${10} !" echo "第十一个参数为 ${11} !" echo "参数总数有 $# 个!" echo "作为一个字符串输出所有参数 $* !" } # 调用 funWithParam 1 2 3 4 5 6 7 8 9 34 73 funWithReturn(){ echo "这个函数会对输入的两个数字进行相加运算..." echo "输入第一个数字: " read aNum echo "输入第二个数字: " read anotherNum echo "两个数字分别为 $aNum 和 $anotherNum !" return $(($aNum+$anotherNum)) } funWithReturn echo "输入的两个数字之和为 $? !" 函数返回值在调用该函数后通过 $? 来获得