一、
一些组合键:
CTRL+C //中断
CTRL+D //1、输入完成,用于编辑 2、退出当前shell,相当于exit
CTRL+H //退格
CTRL+J //换行
CTRL+L //清屏
CTRL+S //锁屏
CTRL+Q //解锁
CTRL+U //删除当前行,用于登录密码输入错时
CTRL+z //挂起前台进程
reset命令:将花屏的终端恢复到正常状态
关于双圆括号的说明:
1、$(( ))专用于数学计算。例如:echo $(( 3+3),echo $(( a+4))等等。
2、仅(( ))专用于C语言风格的变量赋值。例如(( a = a + 3 )),(( a++ ))等等。
3、凡是在双圆括号内需要引用变量值的,全都不需要加$符号。包括以上两种情况。
冒号命令:
作用:什么都不做,只是传回一个真值0。可用于if判断语句中的空操作。
fc命令:
用于列出登录主机后,最近执行过的命令
# fc -l
$IFS : 是系统默认的分隔符。系统的分隔符默认为空格、制表符、和换行符。当bash shell遇上这几个字符时,它就会认为下一个字段已经开始了。
将分隔符改成空格、制表符、换行符、冒号、分号、和双引号,可用下面的赋值语句:
IFS=$' \t\n':;"
上面的单引号是定界标志符,不影响赋值。可以看出,只有空格、制表符和换行符需要用单引号括起。其他字符都不需要。
可以在脚本中临时改变系统分格符。在引用后再改回来。如下面的脚本:
IFS.OLD=$IFS //保存原IFS
IFS=$’\n’//将分隔符改成换行。
……
……
IFS=$IFS.OLD
如下面的脚本e.sh
脚本执行结果如下,将冒号作为分隔符。显示/etc/passwd文件中的内容。文件中的每个冒号就是一行。
二、改变用户的shell环境:其实质是修改/etc/passwd文件。
可用命令# chsh 用户名
三、在执行shell脚本时,会开启一个子shell,脚本会在子shell中运行,运行完成后,再关闭子shell,返回当前shell。这样一来,所有在脚本中定义的变量、环境等信息等会被释放。
如果想在当前shell中执行脚本程序,可用”点号脚本名”或”source 脚本名”的方式来执行脚本。脚本执行完后,变量不会被释放。
四、调试脚本:
1、检查语法错误:
# bash -v 脚本名
2、跟踪脚本的执行:
# bash -x 脚本名或用
# sh -x 脚本名
五、环境变量
全局环境变量在shell会话和shell子进程中皆可见。本地环境变量只在定义它们的进程中可见。
1、查看全局环境变量:
# printenv
2、显示全局环境变量和本地环境变量(全都显示)
# set
set -o //显示当前bash shell所有属性的开关状态。
关闭一个bash shell属性
bash +o emacs
关闭一个bash shell属性
bash -o emacs
3、定义本地环境变量
(1)、格式:变量名=值
# a=3
注意:
●“=”两边不能有空格。否则shell会认为空格后是一条新的命令。
●如果要定义带空格的变量,需要放在引号之间。否则shell会认为空格后是另一个命令。#a=’aaa bbb’
●本地环境变量尽量用小写字母,用来区分系统环境变量(它们都是大写)。
●本地环境变量不能在子shell中使用。
4、采用C语言风格对变量进行操作:通过双圆括号来实现:
(1)、定义变量,可用C语言风格,中间加空格符,当然也可不加空格。
格式:((变量名= 值))
(2)、变量计算,可用++,--等C语言风格
常用运算有:
((变量名++))
((变量名--))
((++变量名))
((--变量名))
((变量名= 变量名+ 常量/变量))
((变量名**2)) //求平方
((变量名**8)) //求8次方
还支持以下运算:
位运算:
<< :按位左移
>> :按位右移
& :按位与
| :按位或
~ :按位取反
逻辑运算:
&& :逻辑与
|| :逻辑或
! :逻辑非
4、定义全局变量:
方法是:先定义一个本地变量,再用export命令将其定义为全局变量。也可用export命令直接定义。
# A=’abcd’
# export A//此处不要写成$A。
或者用:
# export A=’abcd efg’
全局环境变量可以在子shell中使用
5、删除变量(全局和局部变量都可删除)
方法:用“unset 变量名”来删除。
# unset A
在释放全局变量时要注意一个问题:如果是在父shall中定义的全局环境变量,就必须在父shell中释放,因为如果在子shell中将其释放,返回父shell中后,会发现它仍然存在。见下面的操作。
上面就是在父shell中定义了全局变量,在子shell中无法真正释放的实例。
六、数组变量
1、定义数组变量:
格式:数组名=(值1 值2 值3 值4 ……) //数组从0开始编号# a=(0 1 2 3 4)
2、显示单个数组元素的值:
格式:echo ${数组名[下标]}
# echo ${a[0]}
3、显示全部数组的值:
格式:echo ${数组名[*]} 或者echo ${数组名[@]}
4、给单个数组元素赋值:
格式:数组名[下标]=值
# a[3]=20
5、取得数组的元素个数:
格式:echo ${#数组名[*]} 或者echo ${#数组名[@]}
# echo ${#x[*]}
6、取消数组:
格式:
取消单个数组:unset 数组名[下标]
取消整个数组:unset 数组名
七、进入shell环境中后系统所运行的脚本:
1、进入登录shell时分别运行:
/etc/profile
/etc/profile/*.sh
$HOME/.bash_profile
$HOME/.bashrc
/etc/bashrc
2、非登录shell只运行:
$HOME/.bashrc
/etc/bashrc
/etc/profile.d/*.sh
说明:当开启了一个新的子shell时,都将会运行上述三个文件。
八、取得随机数:RANDOM变量
说明:教材说必须设一个随机数种子,否则无法生成真正的随机数。但我实践的结果却不需要。
随机数种子的用法为:先要赋一个数字给RANDOM。
# RANDOM=$$ //使用bash shell 的进程编号当做随机种子
# echo $RANDOM
程序示例
还可通过系统内核获取随机数
# head -1 /dev/urandom | od -N 2 | head -1 | awk '{print $2 * 1}'
说明:od命令可以把文件内容以八进制输出。"od -N 2" 用于取出文件中的2个字节内容。
数学计算:有四种方法
方法一:使用expr命令(只支持整数运算。不支持浮点数)
注意:运行符两边必须有空格。否则无法计算。
格式:
expr a + b
expr a - b
expr a \* b
expr a / b
expr a % b
expr还可以进行判断,适用于数字和字符串:
expr '字符串1' = '字符串2' //相等返回1,否则返回0 expr 数字1 = 数字2 //相等返回1,否则返回0
expr '字符串1' != '字符串2' //不相等返回1,否则返回0 expr 数字1 != 数字2 //不相等返回1,相等返回0
expr '字符串1' != '字符串2' //不相等返回1,否则返回0 expr 数字1 != 数字2 //不相等返回1,相等返回0
返回字符串的长度:
expr length "字符串"
返回字符/子串的起始位置:
expr index 字符串子串
从一个长字符串中取出指定长度的子串。
expr substr 长字串起始位置取出的子串长度
如:
expr substr 'abcdefg' 2 3 //从第2个字符的位置取出3个字符。
数学计算方法二:(只支持整数运算。不支持浮点数)
将运算表达式用$[]括起来。运算符两边可加空格,也可不加空格。格式为:
# $[数学表达式]
数学运算方法四:用$符+双圆括号(只支持整数运算,不支持浮点运算)
数学运算方法四:用计算器bc(支持浮点运算和整数运算)
# bc -q
-q表示不显示软件版本信息
quit:退出bc
scale=4 :设置浮点计算保留4位小数。默认情况下scale=0
print 变量名:打印出变量的值。
在bc中使用变量:
在脚本中使用bc的方法:
#var1=`echo “3*4” | bc ` //注意:管道符两边不能有空格
echo ${var1}
# var1=`echo "scale=4; 3.44/5"|bc` //注意:如果引号内有多条语句,语句之间要用分号隔开。# echo ${var1}
.6880
一个简单的计算脚本如下:
# vim a.sh
#/bin/bash
echo "3 * 5 = ?"
var1=`echo "3*5"|bc`
echo "The answer is: ${var1}"
执行结果:
SHELL脚本的退出状态:
0:命令成功完成。
1:通常的未知错误。
2:误用shell命令。
126:命令无法执行。
127:没有找到命令。
128:无效的退出参数。
128+x:使用Linux信号x的致命错误。
130:使用Ctrl+C终止的命令。
255:规范外的退出状态。
在一个脚本结束时,应该设置一个退出状态。退出状态的代码在0—255之间。格式如下:
exit 退出代码
示例:
#vim a.sh
# /bin/bash
echo “the program end.”
exit 1 //设置退出代码为1