shell是一个命令解释器,侦听用户指令,启动这些指令进程,并将结果返回。(交互式shell)
同时shell也是一种程序设计语言,它有变量\关键字,各种流程控制语句。有自己的语法结构。
shell也有很多种,最常见的是bash,它是rhel默认的shell
查看shell信息
cat /etc/shells
echo $SHELL--查看当前shell
bash --version--查看当前shell版本
修改用户shell
1.vim /etc/passwd 最后一个字段
2.chsh -s /bin/ksh tan2
bash初始化
用户登录时,要执行几个文件
/etc/profile
~/.bash_profile
/etc/bashrc
~/.bashrc
~/.bash_logout
工作时:
~/.bash_history命令历史
与.bash_history相关的设置在/etc/profile中
命令历史调用:
!!执行前一个命令
!n执行编号为n的命令
!-n倒数第n个历史命令
!cmd 执行最近以cmd开头的命令
esc + .上次命令的最后参数
禁用命令历史
1.将/etc/profile中的HISTSIZE=0
2.删除.bash_history 再创建一个同名的指向/dev/null的软链接
bash中同时执行多条命令
1.有条件执行
命令用&&或||
&&前一个执行成功,才执行后一个
||前一个执行不成功,才执行后一个
2.无条件执行
命令依次写,用分号隔开.
3.在子shell中执行,(),执行完之后再退出来,将结果返回主shell
(cd /etc/X11;ls)
命令执行的返回值
Linux每个进程执行完退出后,都会给父进程一点信息,叫返回状态,
范围一般为0~255的整数
0表示成功无错误,其他的表示各种各样的问题
查看返回值状态:$?
()可以改变执行顺序
命令行的替换
{}字符展开
touch hello{1,2,3}.c
$变量替代(取变量值)
${}变量替代(取变量值),安全取变量
$ (())数学运算
echo $((3*5))
``或$()命令替换(取命令执行的结果)
mkdir `echo root`
先执行echo root
再执行mkdir root
或者 mkdir $(echo $USER)
创建Shell步骤
1.创建一个脚本文件(第一行 #!/bin/bash)
2.设置其可执行权限
3.执行
如果没有执行权限可以:
bash 文件名
source 文件名
shell调试
bash [option] 文件名
bash -x /test 显示过程,显示参数,变量值
-n检查语法
1.输入密码,再回显
read 读数据,再将数据保存在变量中
格式:read [option] varname
-p提示
-s输入时不显示
-t n设置超时,如果几秒内不输入,就自动跳过
1 #!/bin/bash
2
3 read -s -p "Enter your password: " password
4 echo "\n"
5 echo "your password is: "
6 echo $password
2.从键盘输入两个数,显示其中较大的那个:
if条件判断
格式:
if [ 条件 ]; then
commands
fi
-----------------------------------
if [ 条件 ]
then
commands
fi
条件判断:
数值
-gt大于
-ge大于等于
-lt小于
-le小于等于
-eq等于
-ne不等于
4 read -p "input a " a
5 read -p "input b " b
6 read -p "input c " c
7
8 if [ $a -le $b ];then
9 a=$b
10 fi
11 if [ $a -le $c ];then
12 a=$c
13 fi
14 echo $a
15
3.从键盘输入用户名,输完之后显示 hello,xx,如果5秒还没输入,就显示hello 当前用户名
if [ 条件 ]; then
commands
else
commands
fi
----------------------------------------------------------------
4.输入一个IP,判断这个主机是否能够ping通,并给出提示
4 read -p "input the IP : " ip
5
6 echo
7 if ping -c 1 $ip > /dev/null
8 then
9 echo "ok"
10 else
11 echo "not"
12 fi
13 echo
14
---------------------------------------------------------------
Shell变量
shell变量分为:局部变量和环境变量
环境变量中又有:
普通环境变量
位置参数
特定变量参数
局部变量:只存在于创建它的shell中,不能被子shell继承
环境变量:能被子shell继承
export B="abc" 定义为环境变量
C="abc"缺省为局部变量
查看变量
set查看所有变量
env查看环境变量
环境变量中系统内置的变量
$?命令执行的退出状态
$$当前shellID
$PPID父进程ID
$!最新的后台进程
$0当前执行程序的名字
$1第一个参数
$2~$10第二个到第十个参数
$#参数的个数
$*位置参数的内容
-----------------------------------------
./t5.sh 10.1.1.1
这样的形式
3 if [ $# -ne 1 ]
4 then
5 echo "Wrong!! Usage [./t5.sh][10.1.1.1]"
6 exit
7 fi
8
9 echo $1
10 if ping -c 1 $1 > /dev/null
11 then
12 echo "Yeeeeeeeeeh!"
13 else
14 echo "Noooooooooo!"
15 fi
16
------------------------------------------------
变量定义:
varname=values
变量名由字母、数字、下划线,但不能以数字开头
.不能出现在变量中,一旦出现立刻结束
变量区分大小写
赋值
1.赋值时=两边不能有空格
2.如果变量其值含有空格,要用引号括起来
变量运算
字符运算:
字符连接:无符号连接
计算长度:${#varname}
取子串:${varname:+/-n:n}
+/-就是字符串的左右多少个,后面n代表取几个
-----------------------------------------------------------------------
条件测试:
字符:
= 等于
!=不等于
\>大于
\<小于
-z长度是否为0(即判断字符是否为空)
-n长度是否不为0(即判断字符是否不为空)
为两个变量赋值(交互式输入read,输入内容为字符),显示其值比较大的
3 read -p "input str1 " str1
4 read -p "input str2 " str2
5
6 if [ $str1 \> $str2 ]
7 then
8 echo "********************"
9 echo $str1
10 else
11 echo "********************"
12 echo $str2
13 fi
------------------------------------------------------------------
文件:
-b filename判断是否为块设备
-c filename判断是否为字符设备
-d filename 判断是否为目录
-e filename判断文件是否存在
-f filename 判断是否为普通文件
任意输入一个文件名(含路径),判断是否存在并给出相应提示,如果不存在就创建它,并提示创建了该文件
read -p "input a file name(include path) :" filename
if [ -e $filename ]
then
echo
echo $filename "exist!"
exit 1
else
echo $filename "has been created !"
exec mkdir $filename
fi
----------------------------------------------------------------------------