shell编程
1.source命令
source 配置文件 # 立即是配置文件生效
. 配置文件 # ./ 是当前文件夹 .后加空格效果等于source
2.配置文件
/etc/profile #对每个用户起作用
/etc/profile.d/*.sh
/etc/bashrc
~/bash_profile #每个用户的配置文件
~/.bashrc
~/.bash_logout #退出执行
PS1变量
umash
PATH
umask
![](/Users/mac/Library/Containers/com.tencent.qq/Data/Library/Application Support/QQ/Users/1213327162/QQ/Temp.db/20369CE2-564A-4E06-A944-684EC910E649.png)
3.登录提示信息(issue只对本机,如果issue.net远程登录)
![](/Users/mac/Library/Containers/com.tencent.qq/Data/Library/Application Support/QQ/Users/1213327162/QQ/Temp.db/C9BED461-9647-4109-9A04-0EAACC857562.png)
![](/Users/mac/Library/Containers/com.tencent.qq/Data/Library/Application Support/QQ/Users/1213327162/QQ/Temp.db/7E325742-2430-4127-96A3-0C6B6A035821.png)
4.退出欢迎
/etc/motd #远程和本地都可以
5.echo命令
mac@MacBook-Air ~/Desktop echo -e "\e[1;31m 我喜欢你兰老师,我要追你 \e[0m"
我喜欢你兰老师,我要追你
\n #换行
\t #table
30m | 31m | 32m | 33m | 34m | 35m | 36m | 37m |
---|---|---|---|---|---|---|---|
黑色 | 红色 | 绿色 | 黄色 | 蓝色 | 洋红 | 青色 | 白色 |
一、Bash的基础功能
-
历史别名和快捷键
alias mvn="/Users/liuxin/Desktop/apache-maven-3.2.1/bin"
-
输出重定向
- 键盘输出 /dev/stdin 0
- 显示输出 /dev/stdout 1
- 错误输出 /dev/stderr 2
- 覆盖重定向 >
- 追加重定向 >>
- 输出报错信息 2>
- 命令 >~/text 2>&1 如果命令正确就写到text中,错误就输出到2里然后在输出到1里面
- 命令&>~/text 等同于上一个,简单写法
- 命令>文件1 2>文件2 把正确的放文件1,错误的放到文件2
-
多命令顺序执行
- ; 多个命令顺序执行 【缺点就是错误了,后面也执行】
- && 连接服 【如果错就不执行】
- 命令1&&命令2 【命令1对就执行命令2,不对就不执行2了】
- 命令1||命令2 【 命令1错误了,就执行命令2,对了就不执行命令2
- ls && echo yes || echo no 【 如果正确就yes如果错了就no
-
输入重定向(crtl+d查看)
- -c 统计字节数
- -w 统计单词数
- -i 统计行数
- wc < access.log 或者wc access.log 统计文件
- Wc << ddy 当输入的内容中遇到ddy就结束,开始统计
-
Shell统配符号
- ? 匹配一个任意字符
- * 匹配0个或多个
- [] 匹配中括号中任意一个
- [-] 匹配中括号中范围 [a-z]任何一个 一个
- [^] 不匹配中括号中范围 [^a-z]
-
管道福
- 命令1 | 命令2 【命令1的内容,作为命令2的条件】
- ls -i /etc | more 【分屏幕查看】
-
黑洞
- ls &>/dev/null 所有信息,都扔了不看
二、Bash变量
-
export
变量名=变量值 -
Bash 进入子shell 然后export y=123 然后set就能看到y的变量
mac@MacBook-Air ~/Desktop bash bash-3.2$ export y=123 bash-3.2$ set
-
Locale 查看语系 等同于 echo $LANG
mac@MacBook-Air ~/Desktop echo $LANG zh_CN.UTF-8
-
位置参数变量
$n n为数字,$0代表命令本身,$1-$9 代表第一到第九个参数,十以上参数,需要大括号${10} $* 这个变量代表命令行中所有的参数,$* 把所有参数看成一个整体 $@ 这个把命令行中参数区别对待,可以遍历 $# 这个变量代表命令行中所有参数的个数 $? 返回零代表执行成功,反之失败 $$ 当前进程号 $! 后台运行进程号
#!bin/shell num1=$1 num2=$2 sum=$(($num1+$num2)) # 双括号,如果是单括号,是输出字符串,双括号是计算 echo $sum
#!bin/shell #在当前目录下创建num1目录,然后进入num1目录创建num2目录 num1=$1 num2=$2 cd ./ mkdir $1 cd ./$1 mkdir $2
![](/Users/mac/Library/Containers/com.tencent.qq/Data/Library/Application Support/QQ/Users/1213327162/QQ/Temp.db/6021D4E2-A302-455B-9162-B78530DCA613.png)
#!bin/bash
for i in "$@"
do
echo "$i"
done
- Read 键盘接受变量
参数 | 解释 |
---|---|
-p | 提示信息 |
-t | 秒数 |
-n | 字符限制 |
-s | 隐藏输入 |
#!/bin/bash
read -p "please input your name:" name
echo "你好,$name 先生"
#!/bin/bash
#时间限制30秒
read -p "please input your name in 30s:" -t 30 name
echo "你好,$name 先生"
#!/bin/bash
#隐藏输入
read -p "please input your password:" -s password
echo "你好,$name 先生"
#!/bin/bash
#只允许接受一个字符,如果不是一个就终止运行
read -p "please input [y|n] end:" -n 1 pw
echo "退出成功"
四、bash运算符
-
declare 声明变量类型
declare [+/-] [选项] 变量名 > - :给变量设定类型属性 > + :取消变量的类型属性 > -a:将变量声明为数组型 > -i:将变量声明为整数类型(integer) > -x:将变量声明为环境变量 > -r:将变量声明为只读变量 > -p:显示指定变量的被声明的类型
movie[0]=1 movie[1]=2 declare -a movie[2]=3 echo ${movie} echo ${movie[2]} echo ${movie[*]}
-
字符串截取命令
- cut 字段提取
- -f 列号:提取第几列
- -d 分隔符: 按照指定分隔符分割 默认是table
mac@MacBook-Air ~/Desktop/ssh cat student UID NAME 1 liuxin 2 ayu 3 haoliang 4 sunxiao # 提取包含i的行数,但是不包含sun mac@MacBook-Air ~/Desktop/ssh grep i student | grep -v sun 1 liuxin 3 haoliang # 截取第二列 默认是table分隔符 mac@MacBook-Air ~/Desktop/ssh grep i student | grep -v sun | cut -f 2 liuxin haoliang mac@MacBook-Air ~/Desktop/ssh grep i student | grep -v sun | cut -f 2 liuxin haoliang
#包含bin/bash的行 mac@MacBook-Air ~/Desktop/ssh grep bin/bash /etc/passwd _mbsetupuser:*:248:248:Setup User:/var/setup:/bin/bash #通过:分割的第五列 mac@MacBook-Air ~/Desktop/ssh grep bin/bash /etc/passwd | cut -f 5 -d ":" Setup User
- printf
- awk
- grep
- -v 取反
- cut 字段提取
五、逻辑判断语句
![](/Users/mac/Library/Containers/com.tencent.qq/Data/Library/Application Support/QQ/Users/1213327162/QQ/Temp.db/709FED10-B1FA-4C82-BDAB-890B9BFFB681.png)
-
-e 文件是否存在
-
-d 目录是否存在
test -e /root/bin/install.log test -d /root [-e /root/bin/install.log] [-d /root]
-
文件权限判断![](/Users/mac/Library/Containers/com.tencent.qq/Data/Library/Application Support/QQ/Users/1213327162/QQ/Temp.db/26D69B84-DA59-46BF-BB4F-5E56861F8CE8.png)
-
两个文件之间进行比较
![](/Users/mac/Library/Containers/com.tencent.qq/Data/Library/Application Support/QQ/Users/1213327162/QQ/Temp.db/10E950D3-F1F7-4127-BC5F-9A50BB809069.png)
-
两个整数之间比较
![](/Users/mac/Library/Containers/com.tencent.qq/Data/Library/Application Support/QQ/Users/1213327162/QQ/Temp.db/E55462AA-4FC2-4CC5-9982-84210E1CCE84.png)
-
字符串判断
![](/Users/mac/Library/Containers/com.tencent.qq/Data/Library/Application Support/QQ/Users/1213327162/QQ/Temp.db/17CAD21B-0719-4764-8A2E-EF4C9767CFED.png)
-
多重判断![](/Users/mac/Library/Containers/com.tencent.qq/Data/Library/Application Support/QQ/Users/1213327162/QQ/Temp.db/5107B155-D778-44F1-ADCF-F5EA62B13314.png)
六、流程控制语句
-
单分支if语句
if [];then 程序 fi --- if[] then 程序 fi
read -p "请输入你的项目名:" projectName read -p "请输入动物名:" groupId read -p "请输入服务名:" categoryId echo -e "\e[1;31m 正在为你创建 $projectName 项目... \e[0m " pro=$projectName animal=$groupId category=$categoryId mkdir $pro && $pro创建完整 || $pro 创建失败 cd $pro mkdir src cd src mkdir main mkdir test cd main mkdir java mkdir resources cd java mkdir $animal cd $animal mkdir $category mkdir domain mkdir base mkdir config mkdir dao mkdir manager mkdir modle mkdir rest mkdir service mkdir util cd dao mkdir impl cd ../modle mkdir do mkdir dto mkdir vo cd ../service mkdir impl cd ../../resources mkdir config cd ../ touch application.properties touch application-test.properties touch application-pro.properties touch application-stg.properties
shell正式开始
第一个脚本
#!/bin/bash
#创建项目
read -p "请输入你的项目名:" projectName
read -p "请输入动物名:" groupId
read -p "请输入服务名:" categoryId
if [-z $projectName]
then
read -p "请检查输入的内容是否为空,输入yes退出" -n 1 pw
fi
if [-z $groupId]
then
read -p "请检查输入的内容是否为空,输入yes退出" -n 1 pw
fi
if [-z categoryId]
then
read -p "请检查输入的内容是否为空,输入yes退出" -n 1 pw
fi
pro=$projectName
animal=$groupId
category=$categoryId
mkdir $pro
cd $pro
mkdir src
cd src
mkdir main
mkdir test
cd main
mkdir java
mkdir resources
cd java
mkdir $animal
cd $animal
mkdir $category
mkdir domain
mkdir base
mkdir config
mkdir dao
mkdir manager
mkdir modle
mkdir rest
mkdir service
mkdir util
cd dao
mkdir impl
cd ../modle
mkdir do
mkdir dto
mkdir vo
cd ../service
mkdir impl
cd ../../../resources
mkdir config
touch application.properties
touch application-test.properties
touch application-pro.properties
touch application-stg.properties
cd ../../../
find . -print | sed -e 's;[^/]*/;|____;g;s;____|; |;g'
echo -e "\033[41;37m 已经为你创建完成 $pro 项目 \033[0m"