Shell编程总结
一、Hello World
新建文件test.sh
然后编辑代码:
#!bin/bash/echo “hello world !”
cd 到目标目录下:
chmod +x ./test.sh #使脚本有执行权限./test.sh #运行脚本
另一种运行方式:
sh test.sh
二、变量
- 变量名要求:
a) 只能是数字,字符,下划线,并且首字母不能是数字
b) 中间不能有空格,但是可以有下划线
c) 不能用关键词
- 使用变量:
myshell=”12345”echo ${myshell}
花括号加不加都行,加花括号只是方便解释器识别变量边界。
另外变量和运算符之间不能有空格。
- 只读变量
myshell=“1234”readonly myshell
只读变量意味着不能更改
- 删除变量
myshell=”1234”unset myshell
echo myshell #可以看到什么也没输出
- 变量类型
a) 局部变量:只在shell中起作用,shell运行的时候其他命令不能调用它
b) 环境变量:shell运行的时候,其他命令可以调用的
c) shell变量:是由shell程序设置的特殊变量,有局部变量也有环境变量,这些变量是保证shell的正常运行
- shell字符串
a) 单引号:
i. 任何字符都会原样输出,单引号里面的变量无效
ii. 单引号里面不能出现单引号(转义的也不行)
b) 双引号
i. 双引号里可以有变量
ii. 双引号里可以出现转义字符
eg:
#!/bin/bashyourname='lihua'myshell="Hello, I know you are \"${yourname}\"!"echo ${myshell}
- 拼接字符:
#!/bin/bashyourname="lihua"chat="Hello, "$yourname" !"chat1="Hello, ${yourname} !"echo ${chat} ${chat1}
- 获取字符串长度
#!/bin/bashmyshell="123"echo ${ #myshell}
- 提取子串
#!/bin/bashstring="I'm AI"echo ${string:1:2}
这个地方运行的时候用sh test.sh可能会不兼容,可以用 chmod +x ./test.sh运行
- 查找子串
#!/bin/bashstring="hello, AI"echo `expr index "$string" h` #两边的不是单引号是Esc键下边的那个符号,句式是固定的的
- shell数组
shell只支持一维数组
a) 格式:
数组名=(val1 val2…) #用空格分离
value=(1 2 3 4)
b) 随机访问下标:
value[1]=1
c) 读取数组:
i. ${数组名[下标]}
ii. 读取全部元素${数组名[@]}
d) 获取长度
# 取得数组元素的个数
length=${#数组名[@]}
# 或者
length=${#数组名[*]}
# 取得数组单个元素的长度
lengthn=${#数组名[n]}
- shell注释
前面加#
三、shell传递参数
传递参数的格式,$n,$0表示执行文件名,$1表示第一个参数,之后以此类推:
A+B的小例子:
#!/bin/bashecho "name:$0"a=$1b=$2c=`expr ${a} + ${b}`echo ${c}
几个特殊符号:
参数处理 | 说明 |
$# | 传递到脚本的参数个数 |
$* | 一第一个单字符显示所有脚本传递的参数。 |
$$ | 脚本运行的当前进程ID号 |
$! | 后台运行的最后一个进程的ID号 |
$@ | 与$*相同,使用时加引号,是返回每个参数 |
$- | 显示shell使用的当前选项,与set命令功能相同 |
$? | 显示最后命令的退出状态。0表示没有错误,其他任何值都表示有错误。 |
四、shell基本运算符
a) 基本包括:算数运算符、关系运算符、布尔运算符、字符串运算符、文件测试运算符。
bash不支持原生的数学运算,可以通过其他命令来实现,awk和expr
b) 算数运算符
运算符 | 说明 | 举例 |
+ | 加法 | `expr $a + $b` |
- | 减法 | `expr $a - $b` |
* | 乘法 | `expr $a * $b` |
/ | 除法 | `expr $a / $b` |
% | 取余 | `expr $a % $b` |
= | 赋值 | a=$b |
== | 相等,返回true | [$a == $b] |
!= | 不相等,返回true | [$a != $b] |
#!/bin/basha=1b=2if [ $a == $b ]then echo "equal"fiif [ $a != $b ]then echo "not equal"fi
c) 关系运算符
运算符 | 说明 | 举例 |
-eq | 两个数是否相等 | [ $a –eq $b ] |
-ne | 两个数是否不相等 | [ $a –ne $b ] |
-gt | 左边是否大于右边 | [ $a –gt $b ] |
-lt | 左边是否小于右边 | [ $a –lt $b ] |
-ge | 左边是否大于等于右边 | [ $a –ge $b ] |
-le | 左边是否小于等于右边 | [ $a –le $b ] |
d) 布尔运算符
运算符 | 说明 | 举例 |
! | 非运算 | [ ! false ] |
-o | 或运算 | [ $a –lt 20 –o $b –gt 100 ] |
-a | 与运算 | [ $a –lt 20 –a $b –gt 100 ] |
e) 逻辑运算符
运算符 | 说明 | 举例 |
&& | 逻辑的AND | [[ $a -lt 100 && $b -gt 100 ]] |
|| | 逻辑的 OR | [[ $a -lt 100 || $b -gt 100 ]] |
f) 字符串运算符
运算符 | 说明 | 举例 |
= | 检测两个字符串是否相等 | [ $a = $b ] |
!= | 检测两个字符串是否不等 | [ $a != $b ] |
-z | 检测字符串长度是否为零 | [ -z $a ] |
-n | 检测字符串长度是否不0 | [ -z $a ] |
str | 检测字符串是否为空 | [ $a ] |
g) 文件测试符
操作符 | 说明 | 举例 |
-b file | 检测文件是否是块设备文件 | [ -b $file ] |
-c file | 检测文件是否是字符设备文件 | [ -c $file ] |
-d file | 检测文件是否是目录 | [ -d $file ] |
-f file | 检测文件是否是普通文件 | [ -f $file ] |
-g file | 检测文件是否设置了SGID位 | [ -f $file ] |
-k file | 检测文件是否设置了黏着位 | [ -k $file ] |
-p file | 检测文件是否有名管道 | [ -p $file ] |
-u file | 检测文件是否设置了SUID位 | [ -u $file ] |
-r file | 检测文件是否可读 | [ -r $file ] |
-w file | 检测文件是否可写 | [ -w $file ] |
-x file | 检测文件是否可执行 | [ -x $file ] |
-s file | 检测文件是否为空 | [ -s $file ] |
-e file | 检测文件是否存在 | [ -e $file ] |
五、echo命令
a) 显示字符串
i. echo “It is a test”
ii. 双引号可以省略:echo It is a test
b) 显示转义字符
i. echo “\”It is a test \””
c) 显示变量
#!/bin/bashread nameecho "$name from read"
d) 显示换行
i. echo –e “ok! \n” # -e 开启转义
echo “It is a test”
e) 显示不换行
i. echo –e “ok! \c” # -e 开启转义
echo “It is a test”
f) 将结果重定向至文件
i. echo “It is a test” > myfile
g) 原样输出到字符串,不进行转移或取变量
i. echo ‘$name\”’s
h) 显示执行命令结果
i. echo `date` #这里用的是反引号
六、Shell流程控制、
a) if
语法格式:
if conditionthen command1 command2 …fi
b) if else
if conditionthen command1 …else command1 …fi
c) if else-if else
if condition1then command1elif condition2then command1else commandmfi
d) for 循环
格式:
for var in item1 item2 … itemNdo command1 command2 …Done
例子:
#!/bin/bashvalue=(A B C D)for var in ${value[@]}do echo "The value is: $var"donefor loop in A B C Ddo echo "The value is: $loop"done
e) while循环
while conditiondo commanddone
例子:
#!/bin/bashint=1while(( $int<=5 ))do echo $int let "int++"done
f) until循环
就像do-while和while循环的区别一样
g) case
就像switch。
格式:
case 值 in 模式1) command1 … ;; 模式2) command2 … ;; esac #就像C语言中的default
h) break、continue、esac
七、shell函数
格式:
[ function ] funname [()]{ action; [return int;]}
例子:
#!/bin/bashdemoFun() { echo "$1" echo "$2"}demoFun 100 110
八、输入输出重定向
命令 | 说明 |
Command > file | 将输出重定向到file |
Command < file | 将输入重定向到file |
Command >> file | 将输出以追加的方式重定向到file |
n > file | 将文件描述符为n的文件重定向到file |
n >> file | 将文件描述符为n的文件以追加的方式重定向到file |
n >& m | 将输出文件m和n合并 |
n <& m | 将输入文件m和n合并 |
<< tag | 将开始标记tag和结束标记tag之间的内容作为输入 |
九、Shell文件包含
格式:
. filename #注意点号和文件名中间有一空格
或
source filename
实例:
test1.sh
#!/bin/bashurl=http://www.runoob.com
test2.sh
#!/bin/bash#通过.号来引用test1.sh文件,这样test1.sh中的东西test2.sh就能用了. ./test1.shecho "$url"