bash编程:
bash进程:解释器
type
shell脚本:
第一行,顶格:
shebang
#!/bin/bash
#!/usr/bin/python
其它的以#开头的行均为注释,会被解释器忽略;
练习:
创建一个组newgroup,id号8008;
创建一个用户,名字为mageedu, id号为3306,附加组为newgroup
创建目录/tmp/hellobash
复制/etc/rc.d/init.d/functions至/tmp/hellobash目录中
过程式编程语言:
顺序执行
选择执行:测试条件,可能会多个测试条件,某条件满足时,则执行对应的分支
循环执行:将同一段代码反复执行多次;因此,循环必须有退出条件;否则,则陷入死循环;
bash
-n: 语法测试
-x: 模拟单步执行
变量类别:
本地变量
环境变量
export:导出
局部变量
位置变量
$1, ..., $n, ${10}
练习:写一个脚本,能接受一个参数作为用户名,此脚本可创建此用户,并且其密码同用户名;
shift [n]
特殊变量:
$?
$#: 传递给脚本参数的个数
$*
$@:引用传递给脚本的所有参数
bash的循环语句:
for:遍历有限的元素列表,
while:
until:
for语句的格式:
for VAR_NAME in LIST
do
循环体
done
LIST:列表,中间包括一个或多个元素
退出条件:遍历结束
练习:创建10个用户,user301, user310
列表:user301, user310
列表:301, 310
生成数值列表:
{start..end}
例如:{1..100}
seq
命令引用
for userNo in {301..310}
for userNo in $(seq 301 310); do
useradd user${userNo}
done
练习:创建目录/tmp/dir-当前日期时间;例如/tmp/dir-20140707-155503
在此目录中创建10个空文件,分别为file1-file10;
练习:写一个脚本
1、创建用户tuser1-tuser9;
2、创建目录/tmp/dir-当前日期时间;
3、在/tmp/dir-当前日期时间 目录中创建9个空文件file101-file109
4、将file101的属主改为tuser1,依次类推,一直将file109的属主改为tuser9;
练习:写一个脚本
1、脚本可以接受一个以上的文件路径作为参数;
2、显示每个文件所拥的行数;
3、显示本次共对多少个文件执行了行数统计;
!/bin/bash
#
for file in $*; do
lines=`wc -l $file | cut -d' ' -f1`
echo "$file has $lines lines."
done
echo "$# files."
练习:写一个脚本
1、显示/etc/passwd文件中位于文件的第偶数行的用户名;并显示共有多少个这样的用户;
#!/bin/bash
#
totalUsers=`wc -l /etc/passwd | cut -d' ' -f1`
for i in `seq 2 2 $totalUsers`; do
userName=`head -n $i /etc/passwd | tail -1 | cut -d: -f1`
echo $userName >> /tmp/passwd.tmp
echo $userName
done
users=`wc -l /tmp/passwd.tmp | cut -d' ' -f1`
echo "Total users: $users."
生成列表的方式:
1、手动给个列表:
for i in 1 2 3 4 5;
2、数值列表:
{start..end}
`seq [start [increment]] end`
3、$*, $@
4、命令生成列表
bash如何实现算术运算:
变量:弱类型
如何定义整型变量:
let VAR_NAME=INTEGER_VALUE
例如:let a=3
declare -i VAR_NAME=INTEGER_VALUE
例如:declare -i a=3
注意:即使没有定义为整型变量,字符型的数字依然可以参与算术运算;bash会执行变量类型的隐式类型转换;
实现算术运算的方式:
let VAR_NAME=ARITHMATIC_EXPRESSION
VAR_NAME=$[ARITHMATIC_EXRESSION]
VAR_NAME=$((EXPRESSION))
VAR_NAME=$(expr $num1 + $num2)
算术运算符:
+
-
*
/
%:取模,取余数
5%2=1,
**: 2**2
练习:计算100以内所有正整数之和
#!/bin/bash
#
declare -i sum=0
for i in {1..100}; do
sum=$[$sum+$i]
done
echo $sum
练习:分别计算100以内所有偶数之和和奇数之和;
#!/bin/bash
#
declare -i evensum=0
declare -i oddsum=0
for i in `seq 1 2 100`; do
oddsum=$[