文章目录
1. shell类型
查看linux系统中包含的shell类型
[root@zhanghao ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/usr/bin/tmux
查看当前linux操作系统中使用的版本
[root@zhanghao ~]# echo $SHELL
/bin/bash
linux脚本开头
#!/bin/bash
在linux所有的脚本中,其实都是#!
后面的/bin/bash表示bash的解释器的路径,名字叫shebang
2. 终端打印
2.1 echo打印
[root@zhanghao ~]# echo "welcome to linux"
welcome to linux
[root@zhanghao ~]# echo -e "test\a"
test
[root@zhanghao ~]# echo -e "test\ntest"
test
test
[root@zhanghao ~]# echo -e "test\rtest"
test
[root@zhanghao ~]# echo -e "test\ttest"
test test
[root@zhanghao ~]# echo -e "test\ftest"
test
test
[root@zhanghao ~]# echo -e "test\etest"
testest
帮助手册
NAME
echo - display a line of text
SYNOPSIS
echo [SHORT-OPTION]... [STRING]...
echo LONG-OPTION
DESCRIPTION
Echo the STRING(s) to standard output.
-n 不输出换行符(\n)
-e 输出中启用反斜杠转义符
-E 不用反斜杠转义符
--help 显示帮助信息
--version 输出版本信息
echo -e情况下,以下的反斜杠有效:
\\ 输出斜杆
\a 警报(BEL)
\b 退格
\c \c之后的字符串不进行输出
\e 换码,\e后面的一个字符删除
\f 错开显示,\f之后的字符换行,但是光标位置保持不变
\n 换行
\r 光标移到行首
\t 插入tab
\v 和\f是相同的
2.2 printf打印
默认不输出换行符,所以要手动添加换行符\n
[root@zhanghao ~]# printf "welcome to linux"
welcome to linux[root@zhanghao ~]#
格式化输出格式
-
:表示靠左输出
%
:表示格式输出起始
n.m
: n表示字符宽度,m表示小数点后面精确的位数
printf "%-5s %-4s %-1.2s\n" name age mark
printf "%-5s %-4s %-1.2s\n" lisi 30 8.333
输出结果:
[root@zhanghao shell]# bash print.sh
name age mark
lisi 30 8.33
2.3 颜色输出
字体颜色输出
#!/bin/bash
echo -e "\e[1;30m color \e[0m"
echo -e "\e[1;31m color \e[0m"
echo -e "\e[1;32m color \e[0m"
echo -e "\e[1;33m color \e[0m"
echo -e "\e[1;34m color \e[0m"
echo -e "\e[1;35m color \e[0m"
echo -e "\e[1;36m color \e[0m"
echo -e "\e[1;37m color \e[0m"
输出结果
背景色输出
[root@zhanghao shell]# cat color.sh
#!/bin/bash
echo -e "\e[1;40m color \e[0m"
echo -e "\e[1;41m color \e[0m"
echo -e "\e[1;42m color \e[0m"
echo -e "\e[1;43m color \e[0m"
echo -e "\e[1;44m color \e[0m"
echo -e "\e[1;45m color \e[0m"
echo -e "\e[1;46m color \e[0m"
echo -e "\e[1;47m color \e[0m"
输出结果
3. 变量
3.1 普通变量
定义变量
key=value
### 将命令的输出结果复制给key
key=$(cmd)
### 将变量设置为只读
readonly key
### 清除变量的值
unset key
= 两边没有空格
如果value中没有空格,则可以不用添加引号,如果有空格,需要添加单引号和双引号
输出命令
echo $key
echo ${key}
3.2 环境变量
进程环境变量
这个配置文件中没有换行符,默认用null(\0),进行分割用tr替换换行符
[root@zhanghao shell]# cat /proc/1139/environ | tr '\0' '\n'
MAIL_CONFIG=/etc/postfix
MAIL_LOGTAG=postfix
LANG=C
GENERATION=2
- set 显示所有shell变量,包括全局变量
- env只是查看全局变量
输出系统环境变量PATH
[root@zhanghao shell]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
添加目录到环境变量
[root@zhanghao shell]# export PATH="$PATH:/shell"
[root@zhanghao shell]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/shell
3.3 位置变量
执行shell脚本时候,可以传递参数,在shell脚本中可以使用变量调用
[root@zhanghao shell]# cat test.sh
#!/bin/bash
echo '位置变量[$@]:' $@
echo '位置变量[$*]:' $*
echo '位置变量[$#]:' $#
echo '位置变量[$0]:' $0
echo '位置变量[$1]:' $1
echo '位置变量[$2]:' $2
echo '位置变量[$3]:' $3
输出结果
#### 执行脚本
[root@zhanghao shell]# bash test.sh 1 2 3 4
位置变量[$@]: 1 2 3 4
位置变量[$*]: 1 2 3 4
位置变量[$#]: 4
位置变量[$0]: test.sh
位置变量[$1]: 1
位置变量[$2]: 2
位置变量[$3]: 3
3.4 预定义变量
变量名 | 含义 |
---|---|
$@ | 输出所有的传入参数,可以用来循环遍历 |
$* | 和$@是一样的,这个输出没有换行符 |
$# | 计算传入的参数的个数 |
$0 | 输出脚本名称 |
$1 | 输出第一个变量 |
$$ | 当前shell的PID |
$? | 返回上一条指令的返回状态,执行成功为0,执行失败非0 |
echo '当前目录:' $PWD
echo '当前用户的家目录:' $HOME
echo '当前用户:' $USER
echo '当前用户的UID:' $UID
echo '当前shell类型:' $SHELL
输出结果
[root@zhanghao shell]# bash test.sh
当前目录: /shell
当前用户的家目录: /root
当前用户: root
当前用户的UID: 0
当前shell类型: /bin/bash
4. 备份脚本
#!/bin/bash
###################
# DATE: 2019-08-25
# AUTHOR: haozi
# Backup file
##################
DATE=`date +'%y-%m-%d'`
BACKUP_DIR=backup
SRC_DIR=/shell
SRC=($@)
INDEX=$#
SUCCESS=`echo -e "\e[1;32msuccess\e[0m"`
FAIL=`echo -e "\e[1;31mfail\e[0m"`
RET=no
if [ $1 == '-h' -o $1 == '-H' ]; then
echo -e "Help Document\n"
printf "%-10s %-30s\n" " " "backup.sh [options] file1 file2 directory1 directory2"
printf "%-10s %-10s %-20s\n" " " "-h or -H" "Display help document"
printf "%-10s %-10s %-20s\n" " " "-y or -Y" "Skip confirmation"
echo -e "\e[1;31m option is only one \e[0m"
exit 0
elif [ $1 == '-y' -o $1 == '-Y' ]; then
RET=yes
START=1
else
START=0
fi
#### 校验备份backup-$data目录是否存在,如果存在,则备份为.bak备份目录
if [ -e $BACKUP_DIR-$DATE ]; then
if [ ! $RET == "yes" ]; then
read -p "Backup directory $BACKUP_DIR-$DATE aleady exist, it will rename $BACKUP_DIR-$DATE as $BACKUP_DIR-$DATE.bak [y/n]:" RET
if [ $RET == "y" -o $RET == "Y" ]; then
mv $BACKUP_DIR-$DATE $BACKUP_DIR-$DATE.bak
else
exit 1
fi
fi
else
mkdir $BACKUP_DIR-$DATE
fi
#### 拷贝备份的文件和目录到备份临时目录,backup-$date下面
cd $SRC_DIR
for ((index=$START; index<$INDEX; index++))
do
if [ -d ${SRC[$index]} ]; then
cp -r ${SRC[$index]} $BACKUP_DIR-$DATE/ && printf "%-10s %-6s %-4s \n" ${SRC[$index]} "=====>" $SUCCESS || printf "%-10s %-6s %-4s \n" ${SRC[$index]} "=====>" $FAIL
else
cp ${SRC[$index]} $BACKUP_DIR-$DATE/ && printf "%-10s %-6s %-4s \n" ${SRC[$index]} "=====>" $SUCCESS || printf "%-10s %-6s %-4s \n" ${SRC[$index]} "=====>" $FAIL
fi
done
#### 开始压缩备份目录
echo -e "####################### start zip ##################\n"
tar zcvf $BACKUP_DIR-$DATE.tar.gz $BACKUP_DIR-$DATE
if [ ! $? -eq 0 ]; then
echo "backup==============>$FAIL"
exit 2
else
echo "backup==============>$SUCCESS"
fi
echo "####################### end zip ##################"
输出效果