shell编程(1)
一、shell简介1、概念 命令解释器2、常见的shell bash : linux标准的shell sh:早期shell,较简单 csh ,ksh ,tcsh :是unix 中的shell3、查看linux中支持的shell vi /etc/shells 4、shell脚本创建一个shell脚本,并打印出来 步骤 1、在ro
一、shell简介
1、概念
命令解释器
2、常见的shell
bash : linux标准的shell
sh:早期shell,较简单
csh ,ksh ,tcsh :是unix 中的shell
3、查看linux中支持的shellvi /etc/shells
4、shell脚本
创建一个shell脚本,并打印出来
步骤
1、在root目录下创建目录sh;mkdir sh
2、进入sh目录下:cd sh/
3、查看sh目录下文件:ls
4、创建一个shell文件命名为hello.sh并进入编辑模式:vi hello.sh
5、进入编辑模式后,按如下格式输入:(其中第一行是必须输入的,echo代表输出格式):
#!/bin/bash
echo "hello,world!"
6、退出编辑模式:先按esc,:wq
脚本执行方式
先赋予其执行权限 :chmod 755 hello.sh
方法一:以绝对路径执行
/root/sh/hello.sh
以相对路径执行
./hello.sh
方法二:用“bash 脚本名”直接执行(脚本不需要赋予执行权限)
bash hello.sh
方法三:用source命令执行,以当前默认Shell解释器执行
5、bash常见功能
1)历史命令
默认保存1000条历史命令
vi /etc/profile 修改环境变量配置文件,要生效,必须注销
HISTSIZE=1000 修改默认历史命令条数
history 查询系统历史命令
历史命令保存文件
~/.bash_history
history -w 把内存中命令历史,保存入文件
history -c 清空所有的历史命
重复历史命令
!n 重复执行第n条命令
!str 重复执行最后一个以str开头的命令
上箭头 调用上面的命令
2)别名
alias 查看系统中生效的别名
alias ls='ls --color=never' 手工设定别名,临时生效
把别名删掉:alias ls='ls --color=tty'
vi ~/.bashrc 写入别名,永久生效
3)输入输出重定向
#设备文件名 #文件描述符 #默认设备
标准输入 /dev/stdin 0 键盘
标准输出 /dev/stdout 1 显示器
标准错误输出 /dev/stderr 2 显示器
a)输出重定向
把应该输出到屏幕的输出,重定向到文件。
> 覆盖
>> 追加
ls > aa 覆盖到aa(解释:把ls下的文件重定向到aa,查看aa下的文件,就是ls下的文件,这就是重定向。如下图)
ls >> aa 追加到aa (示例如下图)
ls gdlslga 2>>aa 错误信息输出到aa 强调:错误输出,不能有空格(该命令是把错误命令追加到aa中)
ls &>aa 错误和正确都输入到aa,但是只能覆盖
ls >> aa 2>>bb 正确信息输入aa,错误信息输入bb
ls >> aa 2>&1 错误和正确都输入到aa,可以追加
2>&1 把标准错误重定向到标准正确输出
4)多命令顺序执行
1)命令1 ; 命令2 ; 命令3 命令123顺序执行。之间没有任何关系
2)命令1 && 命令2 命令1正确执行后,命令2才会执行
3)命令1 || 命令2 命令1执行不正确,命令2才会执行
ls aa && echo "exist" || echo "not exist!" 执行ls aa,判断如果正确,输出“存在”。如果不存在,输出“不存在”
2、本地变量5)管道符
命令1 | 命令2 命令1的执行结果,作为命令2的执行条件
netstat -tlun 查询监听的端口。
netstat -tlun | grep 80 查询监听的端口号,并查看80端口是否启动。
ls -l /etc/ | more 分屏显示ls内容
ls -l /etc/ | grep yum
二 、变量
1、分类
本地变量
环境变量
位置参数变量
预定义变量
1)声明
变量名=变量值 注意:=号左右不能有空格
aa=123
2)调用
echo $变量名
3)查看变量
set 查看所有变量,包括环境变量和本地变量
4)删除
unset 变量名
3、变量设定规则
1)变量以等号连接值,等号不能有空格
2)变量名由数字、字母和下划线组成,不能以数字开头
3)变量值中有空格,用引号括起来
4)双引号内,有特殊字符。如$
5)单引号中特殊字符无含义
6)在变量值中,可以使用 \ 转义符
7)变量值可以直接调用系统命令。 ‘命令’$(命令)
8)变量值可以累加 aa=123 aa="$aa"456 echo $aa --->123456
9)环境变量一定设为大写
4、环境变量
1)声明
export 变量名=变量值
export a
2)查看
set 查看所有变量
env export 只能查看环境变量
declare 声明变量类型的,如果不特别声明,所有变量为字符串型
-i 声明为int
-x 声明为环境变量
3)删除
unset 变量名
4)常见环境变量
echo $PATH /usr/keyberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin 系统查找命令的路径
PATH="$PATH":/root/shell 在系统默认路径后,追加/root/shell目录作为命令查找路径
5)环境变量配置文件
/etc/profile
/etc/bashrc 所有用户生效
~/.bashrc
~/.bash_profile 只对指定用户生效
5、位置参数变量
位置参数变量 说明 $0 命令自己 $1 第一个参数 $2 第二个参数 ...... ...... $9 第九个参数 示例:输出位置参数变量,脚本后要接参数
#!/bin/bash echo "the command is $0" echo "canshu1 is $1" echo "canshu2 is $2"
步骤如下:
1、创建一个shell文件命名为canshu.sh并进入编辑模式:vi canshu.sh
2、进入编辑模式后,按如下格式输入:(其中第一行是必须输入的,echo代表输出格式):
#!/bin/bash
echo "the command is $0"
echo "canshu1 is $1"
echo "canshu1 is $1"
3、退出编辑模式:先按esc,:wq
4、先赋予其执行权限 :chmod 755 canshu.sh
5、以相对路径执并赋初值1,2,3回车之后,即可看到运行结果: ./canshu.sh 1 2 3
6、查看canshu.sh的内容用:cat canshu.sh
(由于canshu.sh中第一个参数是$0,所以赋值是命令本身(./canshu.sh),其他两个变量依次赋值1,2)
6、预定义变量
$? 上一个命令的返回值。 如果返回值是 “0” 表示上一个命令正确执行,如果是非0,表示上一个命令没有正确执行
$# 统计命令之后的参数个数
$* 返回所有参数
$n 位置参数变量
示例:输出预定义变量
#!/bin/bash echo "canshu geshu is $#" echo "suoyou canshu zhi is $*" echo "$?"
步骤如下:
1、创建一个shell文件命名为canshu.sh并进入编辑模式:vi canshu2.sh
2、进入编辑模式后,按如下格式输入:(其中第一行是必须输入的,echo代表输出格式):
#!/bin/bash
echo "canshu geshu is is $#"
echo "suoyou canshu zhi is $*"
echo "$?"
3、退出编辑模式:先按esc,:wq
4、先赋予其执行权限 :chmod 755 canshu2.sh
5、以相对路径执并赋初值1,2,3,4,5回车之后,即可看到运行结果: ./canshu2.sh 1 2 3 4 5
6、查看canshu2.sh的内容用:cat canshu2.sh
7、键盘读取命令
read -p "提示信息" -t 等待时间 变量名
示例:通过read读入变量值
#!/bin/bash read -p "please inut numl:" -t 30 test1 read -p "input num2:" -t 30 test2 sum=$(($test1+$test2)) echo "num1+num2=$sum"
步骤如下:
1、创建一个shell文件命名为canshu.sh并进入编辑模式:vi read.sh
2、进入编辑模式后,按如下格式输入:(其中第一行是必须输入的,echo代表输出格式):
#!/bin/bash
read -p "please input num1:" -t 30 test1
read -p "input num2:" -t 30 test2
sum=$(($test1+$test2))
echo "num1+num2=$sum"
3、退出编辑模式:先按esc,:wq
4、先赋予其执行权限 :chmod 755 read.sh
5、以相对路径执: ./read.sh
6、可以看到提示,并键盘输入
7、查看read.sh的内容用:cat read.sh
8、数值运算
变量值默认都是字符串型,要想进行数值运算,以下三种任选一种:
1)declare 方法
num1=12
num2=14
declare -i sum=$num1+$num2
2)sum=$(($num1+$num2))
3)sum=$(expr $num1 + $num2) (注意+号左右两边必须空格)
4)运算符
+ - \* / %取余
三、shell中常用命令
1、行提取命令 grep
选项: -v 反向选择
-n 提取时,显示行号
举例:(用正则表达式匹配)
grep “[^a-z]hen” test.txt (在文档test.txt中匹配hen前不是小写字母的行匹配)注:和开头没有关系
grep "\.$" test.txt (在文档test.txt中匹配以.结尾的行)
grep “^[^A-Za-z]” test.txt (在test.txt中匹配不以字母开头的行)注:所有字母不能这样写A-z
grep "oo*" test.txt (匹配最少一个o)
grep "^$" test.txt (匹配空白行^代表行首,$代表行尾)
2、列提取命令
1)cut 格式:
cut -d “分隔符” -f 提取列 文件名
比如:
cat /etc/passwd | grep "/bin/bash" | cut -d ":" -f 1,3 (提取passwd文件中可以登录的用户的用户名和UID) (具体意思是:cat /etc/passwd是把passwd打开,| 表示管道符,grep "/bin/bash"是把打开的passwd中提取/bin/bash的行,在行的基础上提取第1,3列,cut -d ":" -f 1,3)
2)awk
awk '条件 {动作}'
last | awk '{printf $1 "\t" $3 "\n"}' (提取last显示结果的第一和第三列,其中last表示最后登录的信息)
\t tab键
\n 换行
\r 回车
再比如:在last中提取包含ip的行,在行中提取第一和第三列
last | grep "[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}"|awk '{printf $1 "\t" $3 "\n"}'
awk 内置变量 FS指定分隔符
more /etc/passwd | awk 'BEGIN {FS=":"} {printf $1 "\t" $3 "\n"}'
读取passwd文件,以“:”为分隔符,截取第一和第三列
BEGIN 在截取前使分隔符生效。如果没有BEGIN,那么第一行自定义的分隔符不生效
3、echo命令
echo -e "输出内容"
-e 识别格式化打印内容
echo -e “1\t2\t3” 打印tab键
echo -e "\e[1;31m this is red text \e[0m" 输出红色字体
\e[ 格式(以其开头,并以其为结尾)
1;31m 指定颜色
0m 恢复颜色(重置)
30m=黑色,31m=红色,32m=绿色,33m=黄色,34m=蓝色,35m=洋红,36m青色,37m=白色
echo -e "\e[1;42m background \e[0m"
背景颜色:40=黑色,41=红色,42=绿色,43=黄色,44=蓝色,45=洋红,46=青色,47=白色
实例:echo输出的小游戏
cat -A 文件名 (显示文件,包括隐藏字符)
取消dos文档的回车符,有两种办法
1)dos2unix 文档名
2)vi -b 文档
:%s/^M//g ^M使用ctrl+v+m输入
数据备份:
#!/bin/bash DAY=`date +%Y%m%d` #定义日期变量 SIZE='du -sh /var/lib/mysql' #定义mysql目录大学的变量 echo "Date:$DAY">>/tmp/dbinfo.txt #把日期输入信息文档 echo "Date Size:$SIZE">>/tmp/dbinfo.txt #把大学输入信息文档 cd /opt/dbbak #切换目录 tar zcvf mysqlbak-${DAY}.tar.gz /var/lib/mysql/tmp/dbinfo.txt #打包备份mysql目录,同时打包信息文档 rm -f /tmp/dbinfo.txt
更多推荐
所有评论(0)