一:第一个shell脚本
1:shell的作用
[root@localhost ~]# cat /etc/shells
2:编写第一个shell脚本
[root@localhost ~]# vi first.sh
cd /boot/
pwd
ls -lh vml*
[root@localhost ~]# chmod +x first.sh
[root@localhost ~]# ./first.sh
[root@localhost ~]# vi first.sh
#!/bin/bash
#this is my first shell script
cd /boot/
echo "当前的目录位于:"
pwd
echo "其中以vml开头的文件包括:"
ls -lh vml*
[root@localhost ~]# ./first.sh
[root@localhost ~]# sh first.sh
[root@localhost ~]# bash first.sh
[root@localhost ~]# . first.sh
[root@localhost ~]# source first.sh
注释:“./”、sh、bash是相同的执行方式,“.”和source是相同的
source和“.”执行脚本时,将脚本中语句在本shell中执行,
sh、bash和./是在执行脚本时先启动一个新的shell,然后让脚本中的语句在新的shell中执行,执行完后就退出。
二:重定向与管道操作
1:重定向
1):重定向输出
[root@localhost ~]# uname -p > kernel.txt
[root@localhost ~]# cat kernel.txt
[root@localhost ~]# uname -r >> kernel.txt \\追加并保存,不覆盖原有的数据
[root@localhost ~]# cat kernel.txt
扩展:
[root@localhost ~]# sed -i '1a\aaa' 123.txt #在第一行的下一行添加文字
[root@localhost ~]# sed -i '1i\aaa' 123.txt #在第一行的上一行添加文字
2):重定向输入
[root@localhost ~]# echo "123456">pass.txt
[root@localhost ~]# useradd aaa
[root@localhost ~]# passwd --stdin aaa <pass.txt \\selinux要设置为disabled
或
[root@localhost ~]# echo aptech | passwd --stdin aaa \\不用关闭selinux
3):重定向错误
[root@localhost ~]# tar jcf /nonedir/etc.tgz /etc/ 2>error.log
[root@localhost ~]# cat error.log
案例:
[root@localhost ~]# vi httpd_install.sh
#!/bin/bash
# 自动编译安装httpd服务器脚本
tar zxvf httpd-2.4.25.tar.gz &>/dev/null
cd httpd-2.4.25
yum -y install gcc apr-devel apr-util apr-util-devel pcre-devel
./configure --prefix=/usr/local/httpd --enable-so &>/dev/null
make &>/dev/null
make install &> /dev/null
echo "正在安装,请稍后......"
echo "http test">/usr/local/httpd/htdocs/index.html
/usr/local/httpd/bin/apachectl start >/dev/null
curl 127.0.0.1
[root@localhost ~]# chmod +x httpd_install.sh
[root@localhost ~]# ./httpd_install.sh
2:管道操作
[root@localhost ~]# grep "/bin/bash$" /etc/passwd \\以bash结尾的行
[root@localhost ~]# grep "/bin/bash$" /etc/passwd | awk -F: '{print $1,$7}'
[root@localhost ~]# df -hT
[root@localhost ~]# df -hT | grep "/$" | awk '{print $6}' #根目录下磁盘利用率
三:使用shell变量
变量名不能用数字开头
变量名中不能有小数点
变量名不能用纯数字
变量名可以是字母开头再加数字,或下划线开头加字母或数字
变量名中不能有斜杠“/”、“$”、“#”、“@”等特殊符号
等号前后不能加空格
1:自定义变量
[root@localhost ~]# name=benet
[root@localhost ~]# version=5.0
2:查看和引用变量的值
[root@localhost ~]# echo $name
benet
[root@localhost ~]# echo $name$version
benet 5.0
[root@localhost ~]# echo $name4.5 \\错误的引用
.5
[root@localhost ~]# echo ${name}4.5
benet4.5
注意:引用变量时如果变量名后有其他的字符,要将变量名应大括号引起来,用以定界
3:变量赋值的特殊操作
1):双引号
双引号可用于字符串的声明,双引号中的$符号或当做变量进行输出。连续的字符可以省略双引号,字符串中有空格的话就不能省略,另外,声明的变量值中如果要引用另一个变量,也需要双引号。
[root@localhost ~]# name=benet 5.0 \\错误的赋值
bash: 5.0: command not found
[root@localhost ~]# namet="benet 5.0"
[root@localhost ~]# echo $name
[root@localhost ~]# accp="accp $version"
[root@localhost ~]# echo $accp
accp 5.0
2):单引号
单引号用于原样输出的变量声明,意思是变量的值中需要保留显示$符号
[root@localhost ~]# accp='accp $version'
[root@localhost ~]# echo $accp
accp $version \\单引号中不能再引用变量,因此此处是错误的输出
3):反撇号
反引号用于命令的引用,相当于$(),区别在于反引号不能嵌套,而$()可以嵌套
[root@localhost ~]# ls -lh `which useradd`
[root@localhost ~]# aaa=`grep -v "^#" /etc/profile`
[root@localhost ~]# echo $aaa
[root@localhost ~]# rpm -qc $(rpm -qf $(which useradd))
备注:
-qf:查找该文件属于哪一个已安装的软件包
-qc:列出该软件包生成的所有文件
4):read命令
[root@localhost ~]# read todir1
/opt/backup/ \\用户输进去的
[root@localhost ~]# echo $todir1
/opt/backup/
[root@localhost ~]# read -p "请制定备份存放的目录:" todir2
请制定备份存放的目录:/opt/backup
[root@localhost ~]# echo $todir2
/opt/backup
综合案例
[root@localhost ~]# vi httpd_install.sh
#!/bin/bash
# 自动编译安装httpd服务器脚本
read -p 请输入源码包的目录: mydir
cd $mydir
read -p 请输入软件包的名字: pack
tar zxvf ${pack}*.tar.gz &>/dev/null
cd /$mydir/${pack}*
./configure --prefix=/usr/local/$pack &>/dev/null
make &>/dev/null
make install &> /dev/null
/usr/local/httpd/bin/apachectl start
firefox 127.0.0.1
[root@localhost ~]# chmod +x httpd_install.sh
[root@localhost ~]# ./httpd_install.sh
4:设置变量的作用范围
1):例1
[root@localhost ~]# echo "name $version"
product 5.0
[root@localhost ~]# bash
[root@localhost ~]# echo "name$version"
product
[root@localhost ~]# exit
exit
[root@localhost ~]# echo "name$version"
product 5.0
2):例2
[root@localhost ~]# echo "name$version"
name5.0
[root@localhost ~]# echo "$name$version"
benet 5.0
[root@localhost ~]# export name version \\导出为全局变量
[root@localhost ~]# bash
[root@localhost ~]# echo "$name$version"
benet 5.0
[root@localhost ~]# exit
exit
3):例3
[root@localhost ~]# export fqdn="www.benet.com"
[root@localhost ~]# echo $fqdn
5:数值变量的运算
[root@localhost ~]# x=35
[root@localhost ~]# y=16
[root@localhost ~]# expr $x+$y
35+16
[root@localhost ~]# expr $x + $y
51
[root@localhost ~]# expr $x - $y
19
[root@localhost ~]# expr $x \* $y
560
[root@localhost ~]# expr $x / $y
2
[root@localhost ~]# expr $x % $y
3
[root@localhost ~]# Ycube=`expr $y \* $y \* $y`
[root@localhost ~]# echo $Ycube
4096
[root@localhost ~]# a=2
[root@localhost ~]# echo $((a*3))
6
[root@localhost ~]# echo $((a**3)) #3次方
8
四:特殊的shell变量
1:环境变量
set命令也可以显示环境变量,它显示的是系统中所有的环境变量,包括全局变量和局部变量
env只显示全局变量
[root@localhost ~]# env
[root@localhost ~]# ls -lh /root/first.sh
[root@localhost ~]# echo $PATH
[root@localhost ~]# first.sh
bash: first.sh: command not found
[root@localhost ~]# PATH="$PATH:/root"
[root@localhost ~]# echo $PATH
[root@localhost ~]# first.sh
/boot
[root@localhost ~]# vi /etc/profile
修改
export HISTORYSIZE=20
[root@localhost ~]# history | wc -l
89
[root@localhost ~]# source /etc/profile
[root@localhost ~]# history | wc -l
20
2:位置变量
[root@localhost ~]# vi adder2num.sh
#!/bin/bash
SUM=`expr $1 + $2`
echo "$1 + $2 = $SUM"
[root@localhost ~]# chmod +x adder2num.sh
[root@localhost ~]# ./adder2num.sh 12 14
12 + 14 = 26
3:预定义变量
$# 传送给命令Shell的参数个数
$- 在Shell启动或使用set命令时提供选项
$? 上一条命令执行后返回的值
$$ 当前shell的进程号
$! 上一个子进程的进程号
$@ 所有的参数,每个都用双括号括起
$* 所有参数,用双括号括起
$n 位置参数值,n表示位置
$0 当前shell名
备注:
$@:输出所有参数,把输出的参数当做一个个独立的单词,便于遍历所有的参数
$*:输出所有参数,把所有输出的参数当做一个整体。
这两个变量在输出时,视觉上是一样的,但存储方式不一样
(1)例1
[root@localhost ~]# vi mybak.sh
#!/bin/bash
TARFILE=beifen-`date +%s`.tgz
tar zcf $TARFILE $* &> /dev/null
echo "已执行 $0 脚本,"
echo "共完成 $# 个对象的备份"
echo “具体内容包括: $*”
[root@localhost ~]# chmod +x mybak.sh
[root@localhost ~]# ./mybak.sh /boot/grub
已执行 ./mybak.sh 脚本,
共完成 1 个对象的备份
“具体内容包括: /boot/grub”
[root@localhost ~]# ./mybak.sh /etc/passwd /etc/shadow
已执行 ./mybak.sh 脚本,
共完成 2 个对象的备份
“具体内容包括: /etc/passwd /etc/shadow”
[root@localhost ~]# ls -lh beifen-*
-rw-r--r--. 1 root root 101K 12月 1 22:36 beifen-1448980601.tgz
-rw-r--r--. 1 root root 1.1K 12月 1 22:37 beifen-1448980640.tgz
(2)例2
[root@localhost ~]# vi adder2num.sh
#!/bin/bash
SUM=`expr $1 + $2`
echo "$1 + $2 = $SUM"
标签:Shell,变量,编程,echo,sh,bash,root,localhost,first From: https://blog.csdn.net/weixin_71499831/article/details/139195151echo $0
echo $#
echo $*
echo $@